2013-10-13 2 views
9

Я играю с потоком контроля обещаний, используя bluebird. Bluebird предоставляет метод .promisify() для преобразования регулярной функции обратного вызова в функцию обещания, но я не понимаю, что я должен делать, когда функция является нерегулярной. Например, метод подписи для requestjs запросуПосылы и нерегулярные обратные вызовы

request(url, callback) 

где обратный вызов

err, res, body 

вместо регулярного

err, res 

Как я должен преобразовать это обещание?

ответ

14

Promise.promisify() может работать с такими обратными вызовами. Если несколько значений заданы, они просто будут передаваться вместе в Array:

var Promise = require('bluebird'); 
var request = Promise.promisify(require('request')); 

request('http://stackoverflow.com').then(function (result) { 
    var response = result[0]; 
    var body = result[1]; 

    console.log(response.statusCode); 
}); 

, который также может быть .spread() обратно отдельные аргументы, как Esailija упомянуто в комментариях:

// ... 

request('http://stackoverflow.com').spread(function (response, body) { 
    console.log(response.statusCode); 
}); 
+5

Вы также должны быть способный использовать ['.spread (function (response, body) {})'] (https://github.com/petkaantonov/bluebird/blob/master/API.md#spreadfunction-fulfilledhandler--function-rejectedhandler-- --promise) вместо '.then' – Esailija