我有一个.each()
循环和在每个循环中更新的全局变量。在每个循环中都有一个collection.find
,node.js不等待搜索完成,甚至在find
得到第一个结果之前就转到下一个元素,这是有问题的。我不认为让它等待是正确的事情,我想以“节点方式”来处理它(告诉我我是否应该这样做)
以下是我的代码的简化版本:
(它会找到恰好是50岁的所有客户,并在他们所在的城市对商店做一些事情)
var clients = db.collection('clients');
var current;
var clientnumber=0;
clients.find({"age":50},function(err,results){
results.each(function(err,client){
if(client){
clientnumber++;
var city = client.city;
shops.find({"_id":city},function(err,resCursor){
resCursor.toArray(function(err,bson){
//does stuff using the city, client number variables and data from "shop"
//including another find and each operation
});
});
clientnumber++;
}
}
});
(clientnumber
不是一个id,它只计算有多少50岁的客户)
当我运行这段代码时,each
循环对于find
来说太快了,所以像clientnumber
和city
这样的变量在调用find
回调时并不是最新的。我应该在这里做什么?
我在考虑为城市创建一个数组,比如cities[clientnumber]=city
,但我不知道如何跟踪clientnumer
。我想在本地传递变量,比如var currentcity=city;
,但我不能确定在转到下一个客户端之前会不会这样做,我不想为每个嵌套都这样做。
如何跟踪我的全局变量?您可以对结构进行注释,但它非常简单,因此可能不适用。
发布于 2016-11-23 11:00:03
按顺序遍历客户端。在开始下一步之前,等待每一步的结束。
clients.find({"age":50},function(err,results){
doclient(clientnumber, 0, results.length, results, function(result){
// alldone, clientnumber in result
})
})
function doclient(clientnumber, done, todo, results, callback)
{
if(done >= todo)
{
return callback(clientnumber);
}
else
{
var client = results[done];
if(client){
clientnumber++;
var city = client.city;
shops.find({"_id":city},function(err,resCursor){
resCursor.toArray(function(err,bson){
//does stuff using the city, client number variables and data from "shop"
//including another find and each operation
// call next client
setImmediate(doclient, clientnumber, ++done, todo, results, callback);
});
});
}
else
{
// call next client
setImmediate(doclient, clientnumber, ++done, todo, results, callback);
}
}
}
https://stackoverflow.com/questions/40762278
复制相似问题