如何在 Bluebird 中使用 Promise 包装 Node.js 回调?这是我想到的,但想知道是否有更好的方法:
return new Promise(function(onFulfilled, onRejected) {
nodeCall(function(err, res) {
if (err) {
onRejected(err);
}
onFulfilled(res);
});
});
如果只需要返回错误,是否有更干净的方法来执行此操作?
Edit我尝试使用 Promise.promisifyAll(),但结果没有传播到 then 子句。我的具体例子如下所示。我使用两个库:a)sequelize,它返回promise,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,以便我可以使用 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
我究竟做错了什么?