JavaScript承诺不等待循环完成执行

时间:2017-11-11 00:13:54

标签: javascript asynchronous promise

我在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()。

谢谢!

1 个答案:

答案 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。没有理由这样做。相反,您可以使用或返回内部承诺,而不需要再次包装它。