Nar*_*esh 8 javascript node.js promise bluebird
如何使用Bluebird中的Promise包装Node.js回调?这就是我想出来的,但想知道是否有更好的方法:
return new Promise(function(onFulfilled, onRejected) {
nodeCall(function(err, res) {
if (err) {
onRejected(err);
}
onFulfilled(res);
});
});
Run Code Online (Sandbox Code Playgroud)
如果只需要返回错误,是否有更简洁的方法来执行此操作?
编辑 我试图使用Promise.promisifyAll(),但结果没有传播到then子句.我的具体示例如下所示.我正在使用两个库:a)sequelize,它返回promises,b)supertest(用于测试http请求),它使用节点样式回调.这是不使用promisifyAll的代码.它调用sequelize初始化数据库,然后发出HTTP请求来创建订单.正确打印Bosth 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();
});
});
});
...
});
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用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();
});
});
...
});
Run Code Online (Sandbox Code Playgroud)
当我到达第二个console.log时,res参数是未定义的.
Create an order
Possibly unhandled TypeError: Cannot read property 'body' of undefined
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
你没有调用promise返回版本,也没有返回它.
试试这个:
// Add a return statement so the promise is chained
return request(app)
.post('/orders')
.send({
customer: 'John Smith'
})
// Call the promise returning version of .end()
.endAsync();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4593 次 |
| 最近记录: |