当前位置: 首页 > 知识库问答 >
问题:

promise的顺序执行[副本]

祁权
2023-03-14

我实现了以下promise函数,比如

return new Promise(function(resolve, reject) { //logic });
  1. cart.getbasket(req)
  2. Cart.UpdateBasket(req)
  3. Cart.UpdateDefaultShipport(req)
  4. cart.GetBasketObject(basket)

当前我执行代码时使用

   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时,它并不像预期的那样工作,因为我看到each的内部函数返回每个promise执行的值。

  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
            });
        });
   });

那么,有没有什么更干净的方法可以实现我用做的事情。然后链,即有一个更干净的链。

此外,在顺序的promise执行中,下一个promise函数是否可能获得已执行的前一个promise的返回值。

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


共有1个答案

郜振国
2023-03-14

您可以在没有不断增加的嵌套的情况下对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。如果您需要其他先验结果,您可以在这里看到各种方法:如何将先验结果与promise链接并共享

 类似资料:
  • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程

  • 关于 promise reduce执行顺序 请高手解释下为何p1和p2为什么都是打印1,p1和p2都在runPromiseInSequence之前执行 这是我尝试修改后的代码, 看起来还是比较吃力,求大佬帮我解析一下,问了chatgpt回答的不正确

  • 打印2的位置 怎么解释呢

  • 问题内容: 作者:HappyLittleFish 问题答案:

  • 此程序成功编译并显示以下输出。 问题 a)我不明白为什么alpha的构造函数没有首先被执行。 我相信“super()”会首先被每个子构造函数隐式调用...对吗?。 b)如果beta的构造函数已经执行,那么为什么打印“5”?(输出中的第二行) 第三行我有点理解(即alpha自己的变量将显示出来,因为还没有对“a”实例变量进行强制转换)

  • 我正在尝试理解代码的调用顺序。来人,请解释一下通话顺序。 根据我的理解,静态块将在JVM开始执行时立即执行,甚至在main类之前执行。然后执行实例初始化块。则应执行构造函数。但如果我们从静态字段调用main方法,回调是如何工作的。以及哪个main将首先被执行,哪个JVM正常执行,哪个static字段显式调用。 附注:我修改了我的问题。前面我把普通方法和构造函数混淆了,所以一些答案看起来可能不相关,