nodejs pg-promise在函数范围之外获取变量

时间:2016-08-22 05:37:22

标签: javascript node.js promise 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-promise和bluebird(这是我用...初始化我的诺言库),但我还没有得到它:(我只是需要能够访问我的查询之外的变量,或者通过某种方式将它们传递给.then()函数,或者其他方式。在上面的例子中,我如何访问在req中传递的一些ID。 params但在查询中?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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访问它们。 Bind将传递给它的对象分配给this,以便为承诺链接的所有函数分配。{/ p>