Как обернуть обратный вызов Node.js с помощью Promise в Bluebird? Это то, что я придумал, но хотел знать, есть ли лучший способ:
return new Promise(function(onFulfilled, onRejected) {
nodeCall(function(err, res) {
if (err) {
onRejected(err);
}
onFulfilled(res);
});
});
Есть ли более чистый способ сделать это, если нужно вернуть только ошибку?
Изменить Я попытался использовать Promise.promisifyAll(), но результат не распространяется на предложение then. Мой конкретный пример показан ниже. Я использую две библиотеки: а) sequenceize, который возвращает промисы, б) супертест (используется для тестирования http-запросов), который использует обратные вызовы в стиле узла. Вот код без использования promisifyAll. Он вызывает sequenceize для инициализации базы данных, а затем делает HTTP-запрос для создания заказа. Оба оператора console.log печатаются правильно:
var request = require('supertest');
describe('Test', function() {
before(function(done) {
// Sync the database
sequelize.sync(
).then(function() {
console.log('Create an order');
request(app)
.post('/orders')
.send({
customer: 'John Smith'
})
.end(function(err, res) {
console.log('order:', res.body);
done();
});
});
});
...
});
Теперь я пытаюсь использовать promisifyAll, чтобы связать вызовы с then:
var request = require('supertest');
Promise.promisifyAll(request.prototype);
describe('Test', function() {
before(function(done) {
// Sync the database
sequelize.sync(
).then(function() {
console.log('Create an order');
request(app)
.post('/orders')
.send({
customer: 'John Smith'
})
.end();
}).then(function(res) {
console.log('order:', res.body);
done();
});
});
...
});
Когда я добираюсь до второго console.log, аргумент res не определен.
Create an order
Possibly unhandled TypeError: Cannot read property 'body' of undefined
Что я делаю не так?
.then
к.then
, который ничего не возвращает. Ваш исходный вопрос является дубликатом, и ваше редактирование касается правильного использования обработчиков.then
. - person Benjamin Gruenbaum   schedule 31.03.2014