result.forEach(element => {
//Get each element
console.log("LOOP");
dbo.collection("users").findOne({email: emailGiven, "friends.email": element.email},function(errT, resultT) {
if (errT){
console.log("Query Error Inside!");
res.status(errT.status); // or use err.statusCode instead
console.log(errT);
//db.close();
//return res.send(errT.message);
}
else {
if (resultT) {
var oneUser = {
email: element.email,
username: element.username,
fullName: element.fullName,
status: resultT
};
//console.log(resultT);
foundUsers.push(oneUser);
} else {
//Not found means not added or pending
var oneUser = {
email: element.email,
username: element.username,
fullName: element.fullName,
status: 0
};
foundUsers.push(oneUser);
//console.log(emailGiven + " " + element.email)
console.log(oneUser);
}
}
});
});
我有一个每个元素的对象数组我想为每个元素执行mongoDB调用,并且根据结果我想将结果推送到数组中,因为我正在做,问题是mongoDb是异步的所以我的主线程完成在我将结果推送到数组foundUsers之前,我该如何解决这个问题呢?
答案 0 :(得分:0)
正如您所说,需要将异步操作处理为同步循环。为此,您可以使用异步库。它在这样的操作中非常有用。
首先在项目中安装异步模块
npm install --save async
之后,你可以这样做:
// for use with Node-style callbacks...
var async = require("async");
var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
var configs = {};
async.forEachOf(obj, (value, key, callback) => {
fs.readFile(__dirname + value, "utf8", (err, data) => {
if (err) return callback(err);
try {
configs[key] = JSON.parse(data);
} catch (e) {
return callback(e);
}
callback();
});
}, err => {
if (err) console.error(err.message);
// configs is now a map of JSON data
doSomethingWith(configs);
});
对于使用此库,它使用async.forEachOf
函数而不是简单的forEach循环。三个参数发送到此功能。