【问题标题】:Sequential execution of Promise [duplicate]Promise 的顺序执行
【发布时间】:2016-08-07 14:10:30
【问题描述】:

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

return new Promise(function(resolve, reject) { //logic });
  1. cart.getBasket(req)
  2. cart.updateBasket(req)
  3. cart.updateDefaultShipment(req)
  4. 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


【解决方案1】:

您可以像这样在不增加嵌套的情况下对 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() 返回一个 Promise 会自动将其链接到父 Promise,这允许您在父 Promise 上使用 .then() 处理程序,而不是使用更深的嵌套来继续序列。

这会自动将前一个 Promise 的结果沿链传递到下一个操作,但它不会将所有先前的结果传递给后续的 Promise。如果您需要其他先前的结果,可以在此处查看各种方法:How to chain and share prior results with Promises

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多