如何在javascript中迭代数组,并在循环块中包含promise,并等待所有promise继续完成

时间:2018-10-02 22:34:16

标签: javascript promise

我需要用一些值迭代javascript中的数组,这些值将用于调用返回诺言的异步函数。没有完成所有承诺,我将无法继续下一个代码部分。

在以下示例中,函数“ processInvoices”必须解析一个promise,直到内部的所有promise都完成为止(假设“ confirmInvoice”是具有不同响应时间的异步函数):

processInvoices(invoices)
{
  return new promise(resolve=>
    {
        invoices.forEach(number=> 
            {

                confirmInvoice(number)
                    .then(result=>{
                              if (!result)
                                {resolve(false);}
                    });
            });
        resolve(true);  // Resolving here doesn´t mean that all promises where completed!

    });
}

init()  // triggered at load..
{
    let invoices = [2,4,8,16,31];
    processInvoices(invoices)
        .then(result=>
            { 
                if (result) // It´s probable that the following message isn´t accurate:
                    console.log('All invoices were processed');
            });

}

使用上面的代码,我不能确定在所有的诺言完成之后,立即执行“ console.log(或任何例程)”。

1 个答案:

答案 0 :(得分:1)

forEach同步运行 。如果要在所有processInvoices解析之前等待所有Promises解析,则应改用Promise.all;将每个发票编号mapPromise,并在产生的承诺数组上调用Promise.all。另外,您的

if (!result) {resolve(false);}

听起来好像是在没有结果的情况下尝试处理错误-在这种情况下,您应该拒绝 Promise,而不是调用resolve。理想情况下,失败的confirmInvoice调用会导致拒绝Promise,但是如果您无法解决此问题,请在result为假时抛出错误,以便可以在{{ 1 {}中的1}}。例如:

catch