地图功能后获取数据

时间:2018-06-19 14:47:59

标签: node.js

无法获取物品。它返回 [] 。但在console.log(item)上显示正确。我想在我的map()运行完成之前。它打印所有数据。如何解决这个问题。我是节点新手。

function getBlockUsers() {
    return new Promise(function (resolve, reject) {

        BlockUser.find({userId:req.user._id}).populate("blockedId").lean().exec(function (err,result) {
            if(err){
                reject({"msg":"failed to getting block user."})
            }else{
                var results = [];
                result.map(function(item){
                    Vehicle.findOne({userId:item.blockedId}).lean().exec(function(err,vehicle){
                        if(vehicle){
                            item.vehicleId = vehicle._id;
                            item.vehicleModel = vehicle.model;
                        }
                        results.push(item)
                        console.log(item)
                    });
                });
                resolve(results);
            }


        })
    });
}

2 个答案:

答案 0 :(得分:0)

问题是您的result.map()中包含非阻塞代码。

您应该尝试仅使用一个数据库查询。然后解决exec回调中的所有项目。否则,对原始查询使用Promise。

Vehicle.find({ $in: { userId: result.map( item => item.blockedId) }}).lean().exec( (err, results) => {
    // add the vehicle / model ids to each item in results
    resolve(results)
})

答案 1 :(得分:0)

由于在map函数中使用了async函数,希望它是同步的,因此需要先创建一个promise数组并使用Promise.all,然后再解决所有结果。

下面的代码应该可以解决您的问题。

function getBlockUsers() {
    return new Promise(function (resolve, reject) {

        BlockUser.find({userId:req.user._id}).populate("blockedId").lean().exec(function (err,result) {
            if(err){
                reject({"msg":"failed to getting block user."})
            }else{
                var results = result.map(function(item){
                    // don't forget to return in the map function
                    return new Promise(function (resolve1, reject1) {
                        Vehicle.findOne({userId:item.blockedId}).lean().exec(function(err,vehicle){
                            if (err) return reject1(err)
                            if(vehicle) {
                                item.vehicleId = vehicle._id;
                                item.vehicleModel = vehicle.model;
                            }
                            resolve1(item)
                        });
                    })
                });
                
                // here you wait all the promises of results
                resolve(Promise.all(results));
            }

        })
    });
}