2016-08-22 86 views
1

相对较新的与承诺的工作。现在,我运行以下命令来查询数据库中的一些数据。我明白这个函数是异步的,因此在查询结束之后的某个时候,“then”中的所有内容都会被执行,并将结果传递给该函数。我不明白的是如何访问变量作用域的外部函数,以便我可以使用它们?的NodeJS PG-承诺得到变量之外的功能范围

var db = require('../repositories/db.js'); 
var Response = require('../models/responseModel.js'); 

var dashboard = {}; 

dashboard.getCompany = function (req, res) { 
    var companyId = req.params.companyId.toUpperCase(); 
    var sql = db.getSql('./sql/getCompany.sql'); 

    db.any(sql, { tic: companyId }) 
     .then(function (data) { 
      var r = new Response(true, 'retrieved company', data); 

      // can't do this because companyId is undefined...    
      // console.log(companyId); 

      res.status(200) 
       .json(r); 
     }) 
     .catch(function (err) { 
      var r = new Response(false, err.message); 
      res.send(r); 
     }); 
}; 

一直在PG-承诺研读以及蓝鸟(这就是我初始化我的诺言库...),但我不完全得到它:(我只需要能够访问变量我的查询外,或者通过某种方式将它们传递到。然后()函数,或者一些其他的方式,在上面的例子中,我怎么能访问该公司在req.params但里面查询的推移,一些ID?

任何帮助将不胜感激。

+0

companyId应该在整个getCompany功能来定义。你可能有另一个问题。 –

+0

所以你说我“应该”实际上能够访问它? – dvsoukup

+0

当然。它与承诺无关。尝试记录req.params并查看其中的内容。 –

回答

0

一个很好的选择是使用Promise.bind();

下面是3个函数a,b和c的示例。 C需要A和B的返回值,但b不需要知道什么是回报(这是人为的)。

var Promise = require('bluebird'); 

function a(){ 
    this.p1 = 'hello'; 
} 
function b(){ 
    this.p2 = 'goodbye'; 
} 

function c(){ 
    return this.p1 + this.p2; 
} 

Promise.bind({}) 
    .then(a) 
    .then(b) 
    .then(c) 
    .then((res)=> console.log(res)) 
    .catch(err => console.log(err)); 

这将返回:

hellogoodbye

,你的手Promise.bind(对象)可以是任何你喜欢的对象。所以你可以把你的外部变量放在对象上,他们可以通过this访问。绑定将物品交给它,并将其分配给this,以获得承诺链接的所有功能。

+0

谢谢!这将适用于我需要它做的事情。 – dvsoukup