Как да обвия обратно извикване на Node.js с помощта на Promise в Bluebird? Ето какво измислих, но исках да знам дали има по-добър начин:
return new Promise(function(onFulfilled, onRejected) {
nodeCall(function(err, res) {
if (err) {
onRejected(err);
}
onFulfilled(res);
});
});
Има ли по-чист начин да направите това, ако трябва да се върне само грешка?
Редактиране Опитах се да използвам Promise.promisifyAll(), но резултатът не се разпространява към клаузата then. Моят конкретен пример е показан по-долу. Използвам две библиотеки: a) sequelize, която връща обещания, b) supertest (използвана за тестване на http заявки), която използва обратни извиквания в стил възел. Ето кода без използване на promisifyAll. Той извиква sequelize за инициализиране на базата данни и след това прави 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, за да мога да свържа обажданията с след това:
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