我需要用一些值迭代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(或任何例程)”。
答案 0 :(得分:1)
forEach
同步运行 。如果要在所有processInvoices
解析之前等待所有Promises解析,则应改用Promise.all
;将每个发票编号map
到Promise
,并在产生的承诺数组上调用Promise.all
。另外,您的
if (!result) {resolve(false);}
听起来好像是在没有结果的情况下尝试处理错误-在这种情况下,您应该拒绝 Promise
,而不是调用resolve
。理想情况下,失败的confirmInvoice
调用会导致拒绝Promise
,但是如果您无法解决此问题,请在result
为假时抛出错误,以便可以在{{ 1 {}中的1}}。例如:
catch