Promise 的顺序执行

Sequential execution of Promise

我实现了以下承诺功能,例如

return new Promise(function(resolve, reject) { //logic });
  1. cart.getBasket(要求)
  2. cart.updateBasket(要求)
  3. cart.updateDefaultShipment(要求)
  4. cart.getBasket对象(篮子)

目前我使用

执行代码
   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 returns 每次承诺执行的价值。

  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 链所做的事情,即拥有更清洁的链。

此外,在顺序承诺执行中,下一个承诺函数是否有可能获得前一个已执行承诺的 return 值。

PS : Promise 数组长度会事先知道。

您可以对承诺进行排序,而无需像这样不断增加嵌套:

app.post('/Billing', function(req, res) {
    cart.getBasket(req).then(function(basket) {
        return cart.updateBasket(req);
    }).then(function() {
        return cart.updateDefaultShipment(req);
    }).then(function(basket) {
        return cart.getBasketObject(basket);
    }).then(function(basketObj) {
        res.render('billing', {basket: basketObj});
    }).catch(function(error) {
        console.log(error);
        res.sendStatus(500);
    });
});

.then() 返回承诺会自动将其链接到父承诺,这允许您在父承诺上使用 .then() 处理程序,而不是使用更深的嵌套来继续序列。

这会自动将先前承诺的结果沿链传递到下一个操作,但不会将所有先前结果传递给后续承诺。如果您需要其他先前的结果,可以在此处查看各种方法: