2016-07-04 4 views
3

Я не понимая, что происходит ...выразить res.send как результат обещания

Использование 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); 
}); 

Что случилось?

ответ

5

Ниже приведен фрагмент 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)); 
}); 
+0

'.bind-this' зло, спасибо, должен быть тег для этого :) – Miquel

Смежные вопросы