我在JavaScript中遇到了一些问题。我想要做的是我将根据类别获取项目列表,然后循环通过该列表以获得项目ID中的项目详细信息。
get(category).then((list) => {
let key = new Promise((resolve, reject) => {
for(var i = 0; i <list.length; i++){
// logic
});
}
resolve(list);
console.log(list);
});
key.then((list) => {});
});
现在的问题是上面的代码将执行解析而不等待for循环完成循环。这会导致一个空的ritemlist,它会影响我在promiseKey.then()中的代码逻辑。
正确的顺序是循环完成以完成填充ritemlist然后解析然后是promise.then()。
谢谢!
答案 0 :(得分:4)
承诺没有阻止。因此,在承诺完成之前很久,循环就会运行完成。换句话说,代码中没有任何内容等待循环内的promise。相反,您可以将一个promises列表累积到一个数组中(使用.map()
),然后使用Promise.all()
知道它们何时完成:
getAllReceiptItemIDByCategory(category).then((ritemIDlist) => {
// get all related receipt item details
return Promise.all(ritemIDList.map(ritem => {
return getReceiptItemByID(ritem.receiptItemID);
})).then(receipts => {
console.log(receipts);
return receipts;
}).catch(err => {
console.log(err);
throw err;
});
});
此处显示的.then()
和.catch()
处理程序是可选的,仅用于在本地记录结果。如果调用者正在处理结果或错误而您不需要/等待本地日志记录,则可以省略它们。
此外,请避免使用另一个手动创建的承诺包装现有承诺的promise executor anti-pattern。没有理由这样做。相反,您可以使用或返回内部承诺,而不需要再次包装它。