如何在 JavaScript 中的 forEach 中等待承诺?

How to wait for promise in a forEach in JavaScript?

我想从我的 mongodb 集合中检索一个数组,并在将其发送回客户端之前使用它。 我想要的结果如下:

我当前的代码如下所示:

                db.collection("collection")
                .find()
                .toArray()
                .then((arr) => {
                    arr.forEach(cur => {
                        db.collection("another-collection")
                            .count({key: cur.prop})
                            .then((retrieved) => {
                                cur.prop = retrieved; //The amount of count one live above
                                //This part runs later than the res.success below
                            })
                            .catch((err: any) => {
                                //Handle error
                            });
                    });
                    return arr;
                })
                .then(arr => {
                    res.success(arr);
                })
                .catch((err) => {
                    //Handle error
                });

目前,我想对检索到的数组执行的工作发生在 res.success() 之后,因此在客户端上我将获得原始数组。 为什么会这样?

您可以使用 Promise.all along with Array#map.

.then((arr) => 
    Promise.all(arr.map(cur => 
        db.collection("another-collection")
            .count({
                key: cur.prop
            })
            .then((retrieved) => {
                cur.prop = retrieved; 
                return curr;
            })
            .catch((err: any) => {
                //Handle error
            })
    ))
)