处理内部异步调用时函数参数的作用域是什么?

时间:2016-01-20 08:36:00

标签: node.js asynchronous express q

在我的下面的示例中,其中一个快速应用程序回调的参数表现不同,具体取决于它们是否封装在辅助功能中。我已经解决了我的问题,但我想更好地了解这里发生的事情。

getItembuildView返回使用Q创建的承诺。 以下代码有效(即,没有调用任何失败的回调):

var app = require("express")();
app.get('/item/:itemId', function(req, res){
    var showItem= function(item){
        var s = function(x){res.send(x);};
        buildView(item).then(s).fail(console.log);
    };

    var showError = function(error){
        res.send(error.message);
    };

    getItem(req.params.exception_id)
        .then(showItem).fail(showError);
});

以下代码没有(console.log打印[TypeError: Cannot read property 'req' of undefined]):

var app = require("express")();
app.get('/item/:itemId', function(req, res){
    var showItem= function(item){
        buildView(item).then(res.send).fail(console.log);
    };

    var showError = function(error){
        res.send(error.message);
    };

    getItem(req.params.exception_id)
        .then(showItem).fail(showError);
});

(区别在于第四和第五行,第四行被删除,第五行被修改)。

很明显,承诺buildView正在成功解决,否则第一种方法也会失败;直到应用buildView的两个实现都遵循完全相同的步骤。

为什么这些实现不完全相同? 不应该是当promise buildView被解决时.then(res.send)应该以promise的解析值作为其参数来执行res.send吗? (即第一次实施)。

1 个答案:

答案 0 :(得分:3)

以下内容可行:

buildView(item).then(res.send.bind(res)).fail(console.log);

当您执行then(res.send)时,this的{​​{1}}上下文丢失:res函数与send对象上下文分离。

它与异步性无关,因为这是JavaScript中的known feature of this