首页 > 解决方案 > Promise.all 无法与 Mongo 查询数组一起正常工作

问题描述

我有一个路由数组(推荐路由),我需要对其进行迭代并从 MongoDB 获取路由的所有者(用户)。然后,在从数据库中获取路由后,我将一个额外的userObj附加到路由。

let promiseArr = [];

for (let index = 0; index < obj.recommendedRoutes.length; index++) {
    console.log("Pushed: "+index);
    promiseArr.push( 
        User.find({
            _id : obj.recommendedRoutes[index].userId,
        },(err,data) => {
            if(err) {
                console.log("Database error: " + err);
            }else{
                obj.recommendedRoutes[index].userObj = data[0].toObject();
                console.log("Completed: "+index);
            }
        })
    );    
}

将userObj附加到数组中的所有路由对象后,我需要返回此数组。因此,我将所有查询推送到promiseArr中,并使用 Promise.all 确保仅在解决所有承诺后才返回数组。

Promise.all(promiseArr)
.then(() => {

    console.log("Return Object");
    return res.status(200).send({
        success: true,
        message: "Successfully retrieved Recommended Routes/Carpools",
        obj: obj,
    });

})
.catch((e) => {
    throw "There was an error: "+e;
});

问题是它偶尔会在承诺解决之前返回数组。预期输出:

Pushed: 0
Pushed: 1
Completed: 1
Completed: 0
Return Object

偶尔会发生什么:

Pushed: 0
Pushed: 1
Completed: 1
Return Object
Completed: 0

标签: javascript

解决方案


您没有使用 Promises 而是使用回调...

这是正确的方法:

for (let index = 0; index < obj.recommendedRoutes.length; index++) {
  console.log('Pushed: ' + index);
  promiseArr.push(
    User.find({
      _id: obj.recommendedRoutes[index].userId,
    }).then((data) => {
      obj.recommendedRoutes[index].userObj = data[0].toObject();
      console.log('Completed: ' + index)
    }, err => console.log('Database error: ' + err))
  );
}

推荐阅读