在我的下面的示例中,其中一个快速应用程序回调的参数表现不同,具体取决于它们是否封装在辅助功能中。我已经解决了我的问题,但我想更好地了解这里发生的事情。
getItem
和buildView
返回使用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
吗? (即第一次实施)。
答案 0 :(得分:3)
以下内容可行:
buildView(item).then(res.send.bind(res)).fail(console.log);
当您执行then(res.send)
时,this
的{{1}}上下文丢失:res
函数与send
对象上下文分离。
它与异步性无关,因为这是JavaScript中的known feature of this
。