使用蓝鸟将节点.js回调包装在承诺中
Wrapping Node.js callbacks in Promises using Bluebird
如何在Bluebird中使用Promise包装Node.js回调?这就是我想出的,但想知道是否有更好的方法:
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 请求来创建订单。Bosth 控制台.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();
});
});
...
});
当我到达第二个控制台时.log res 参数未定义。
Create an order
Possibly unhandled TypeError: Cannot read property 'body' of undefined
我做错了什么?
您没有调用 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();
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 如何将函数包装在函数中以避免代码重复
- 从函数返回角度承诺
- 将同步函数包装到承诺中的最佳方法是什么?
- 如何在Angular中用$timeout包装承诺链
- 用Javascript承诺包装同步代码有什么好处吗
- 承诺包装模式
- 这是将readFileSync包装在承诺中的正确方法吗?
- 将承诺包装在承诺中是一种反模式
- 包装现有的API'在承诺避免“;回调地狱”;
- 以棱角分明的方式解决包装的承诺
- 你如何将设置超时包装在承诺中
- 在 ES6 中包装承诺的最简单方法是什么?
- 在JavaScript中,如何在timeout中包装一个承诺
- 未处理的拒绝错误与Ajax蓝鸟承诺包装
- bluebird有一个说服函数来把函数包装在承诺中吗?
- 我怎样才能把几个蓝鸟的承诺包装在一个承诺中
- 用承诺来包装回电的人
- 使用蓝鸟将节点.js回调包装在承诺中