作为承诺表达res.send

时间:2016-07-04 14:43:02

标签: node.js express

我不明白发生了什么......

使用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);
});

怎么了?

1 个答案:

答案 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));
});