我不明白发生了什么......
使用q
承诺,这有效:
const deferred = q.defer();
deferred.resolve('Hellow');
const myPromise = deferred.promise;
router.get('/items', (req, res) => {
myPromise.then((result) => res.send(result));
});
但事实并非如此,如果请求永远不会结束,它会使浏览器保持不变:
router.get('/items', (req, res) => {
myPromise.then(res.send);
});
怎么了?
答案 0 :(得分:12)
以下是与express
相关的res.send
库的片段:
res.send = function send(body) {
var chunk = body;
var encoding;
var len;
var req = this.req;
var type;
// settings
var app = this.app;
// allow status / body
if (arguments.length === 2) {
// res.send(body, status) backwards compat
if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') {
deprecate('res.send(body, status): Use res.status(status).send(body) instead');
this.statusCode = arguments[1];
} else {
deprecate('res.send(status, body): Use res.status(status).send(body) instead');
this.statusCode = arguments[0];
chunk = arguments[1];
}
}
//.....
如您所见,有很多this
引用。在您的情况myPromise.then(res.send)
中,this
引用了承诺对象,而不是res
,这就是您的代码无效的原因。
您可以使用.bind方法更改上下文,因此this
会引用res
对象:
router.get('/items', (req, res) => {
myPromise.then(res.send.bind(res));
});