Node.js NodeJS异步问题:每次从Mongoose获取文档时,我都会得到不同的顺序

Node.js NodeJS异步问题:每次从Mongoose获取文档时,我都会得到不同的顺序,node.js,express,mongoose,Node.js,Express,Mongoose,这段代码没有问题,但每次都会更改文档的顺序 我已经将console.log(id)放在for循环的后面,以检查数组中的顺序及其正确性 async.each(Array, function (id, callback) { console.log(id); // same as array order Pcard.findById(id) .populate(

这段代码没有问题,但每次都会更改文档的顺序

我已经将console.log(id)放在for循环的后面,以检查数组中的顺序及其正确性

 async.each(Array, function (id, callback) {
                    console.log(id); // same as array order
                    Pcard.findById(id)
                        .populate(
                            {
                                path: 'UserTags',
                                model: 'User',
                            },
                            {
                                path: 'Like',
                                model: 'User'
                            }
                        ])
                        .exec(function (err,finalres){
                            if (err) {
                                callback(err);
                            } else {
                                **console.log(finalres._id); // But here id are not in same order** 
                                arr.push(finalres);
                                callback();
                            }
                        });
                }, function (err) {
                    if (err) {
                        res.status(200).send({
                            'error': 'Some err has occurred',
                            'status': false
                        });
                    } else {
                        res.status(200).send({
                            'results': arr,
                            'status': true
                        });
                    }
                });
            }
如何保持每个输出中文档在数组中的顺序

这3个id以相同的顺序存储在MongoDB中,它们是for循环中语句的console.log输出:

5957bcd393ea02554c4e63f3
5957bd177e996b56d08b991a
5957bd742c830457192ba66d
这是第二个console.log语句console.log(finalres.\u id)的结果:

这一次,输出的顺序与数组中id的顺序相同

考虑同样的情况:

 5957bcd393ea02554c4e63f3
 5957bd177e996b56d08b991a
 5957bd742c830457192ba66d
5957bcd393ea02554c4e63f3
5957bd742c830457192ba66d
5957bd177e996b56d08b991a
这里的顺序不同:

 5957bcd393ea02554c4e63f3
 5957bd177e996b56d08b991a
 5957bd742c830457192ba66d
5957bcd393ea02554c4e63f3
5957bd742c830457192ba66d
5957bd177e996b56d08b991a

每次需要做些什么来保留订单?

问题是,您要遍历数组,并为每个项目向mongodb发送请求。在执行异步请求时,库可能正在执行并发作业。因此,某些作业(对mongodb的请求)可以更快地完成,并在其他作业之前返回。这就是订单改变的原因。这不是数组中项目的顺序,而是从mongodb返回的响应顺序

你可以阅读解释

我不熟悉异步库,所以我无法帮助您使用哪种方法来维护订单。如果你想用蓝鸟,你可以用

提示: 此外,mongoose支持承诺,这比回调要好得多。我建议您改用承诺,因为它使代码更具可读性

编辑:您可以使用which返回响应数组,这些响应应按正确的顺序排列。

您应该使用which,它将保持顺序并收集所有结果(而不必使用单独的数组将结果推入):

请注意,这将启动对数据库的并发查询。如果
array
足够大,则可以使用此代码创建I/O瓶颈


如果出现问题,您可以将
async.map()
替换为以限制并发查询的数量。

Hi Kartik,欢迎使用SO。请尝试正确设置您的问题格式,并在此处查看:您不需要将
async
wait
配对吗?我想你应该做一些类似于wait Pcard.findById(id)的事情。这会使我的应用程序崩溃添加wait Pcard.findById(id)非常感谢先生:)但是这里没有错误处理!如果其中一个文档无法填充,它会自动抛出错误吗?@kartikkhandelwal有错误处理,应该与您以前的代码相同。然而,我用可能不清楚的代码走了一条捷径。我会更新我的答案。嘿,如果我像Pcard.findOne(“'u id':id,'flag':true”)一样更新我的代码,那么如果我的标志在一个文档中不为true,那么我在结果数组中得到null!那个么我如何删除那个空值呢???我现在正在使用过滤器,但我不能过滤我的数据!