【发布时间】:2016-08-07 14:10:30
【问题描述】:
我实现了以下承诺功能,如
return new Promise(function(resolve, reject) { //logic });
- cart.getBasket(req)
- cart.updateBasket(req)
- cart.updateDefaultShipment(req)
- cart.getBasketObject(篮子)
目前我使用
执行代码 app.post('/Billing', function(req, res) {
cart.getBasket(req).then(function(basket) {
cart.updateBasket(req).then(function() {
cart.updateDefaultShipment(req).then(function(basket) {
cart.getBasketObject(basket).then(function(basketObj) {
res.render('billing', {
basket: basketObj
});
});
});
});
}).catch(function(error) {
console.log(error);
});
});
我阅读了Promise.each 并考虑使用它,因为我的逻辑流程必须是顺序的,但是当我使用Promise.each 时,它并没有按预期工作,因为我看到inner function of each 返回每个承诺的值执行。
app.post('/Billing', function(req, res) {
var asyncCalls = [cart.getBasket(req), cart.updateBasket(req), cart.updateDefaultShipment(req), cart.getBasketObject(basket)];
Promise.each(asyncCalls, function(basketObj){
res.render('billing', {
basket: basketObj
});
});
});
那么,是否有任何更清洁的方法可以实现 .then 链的操作,即拥有更清洁的链。
另外,在顺序执行 promise 中,下一个 promise 函数是否有可能获得执行的前一个 promise 的返回值。
PS : Promise 数组长度会事先知道。
【问题讨论】:
-
为什么不把链条压平呢?应该不需要嵌套的 Promise。
cart.getBasket(req).then(cart.updateBasket.bind(undefined, req).then(cart.updateDefaultShipment.bind(undefined, req))。你也不必使用 bind ,可以使用 annon 函数。
标签: javascript node.js express promise bluebird