【问题标题】:Javascript wait for Promise to complete inside for-loop before returning responseJavascript 在返回响应之前等待 Promise 在 for 循环内完成
【发布时间】:2018-06-07 13:01:44
【问题描述】:

我正在尝试在 for 循环中的 Promise 完成后做出响应。

我看过thesequestions,但他们没有解决我的情况。

methodGetOrders 和 methodGetLines 是我必须使用的外部库的一部分。他们都打网络电话,所以有一些预期的滞后。该函数总是返回一个“0”,因为它不等待内部承诺完成。我意识到没有办法“等待”承诺完成,但是如何在响应中获得正确的 counter 值?

doWorkMainFunction() {
  methodGetOrders()
    .then(orderList =>  {
       var counter=0;
       for (var i=0; i< orderList.length; i++) {
         methodGetLines()
           .then (lineData => {
              if (someCondition) { counter++; }
            } // end of inner THEN
       } // end FOR loop
       return counter; // This always returns '0'
   } // end of outer THEN
}

【问题讨论】:

    标签: javascript for-loop promise return


    【解决方案1】:

    在循环中创建一个包含所有承诺的数组,然后在所有这些承诺都解决后使用Promise.all() 返回计数器

    methodGetOrders()
      .then(orderList => {
        var counter = 0;
    
        var promises = orderList.map(order => {
          return methodGetLines()
            .then(lineData => {
              if (someCondition) {
                counter++;
              }
            }) // end of inner THEN
        }) // end promise map
        return Promise.all(promises).then(_ => counter);
      }) // end of outer THEN
    })
    

    【讨论】:

    • 对不起,我对 JavaScript 还很陌生,所以我想明确一点:代码中有两个 return 语句?这是“允许的”吗?
    • 您可以拥有任意数量的 return 语句。这里的那些甚至具有不同的功能。
    • 第一个 returnArray#map 内部,给它每个数组项,这恰好是 methodGetLines() 返回的承诺 ...第二个返回到 methodGetOrders
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2022-01-04
    • 2018-06-09
    相关资源
    最近更新 更多