节点js同步for循环
node js synchronous for loop
db.collection("influencer_chat_db").find({}).toArray(function(err, chatResult){
for(i=0;i< chatResult.length;++i){
console.log("A");
await db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
console.log("B")
});
}})
我想使用 for 循环从集合 "chatNewmsgNotification" 中检索数据,但是执行是以同步格式进行的。我用简单易懂的方式编写了代码,预期的执行和输出是 A B A B。目前我得到的是 A A B B。
发生这种情况是因为 callback
函数没有绑定到 promise
所以一旦 promise
returns 仍然有一段未知的(小)时间直到callback
函数被调用,这就是循环设法变得更快的原因。
您有两个简单的修复方法:
- 更改查找以在没有回调的情况下工作:
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {
for (i = 0; i < chatResult.length; ++i) {
console.log("A");
await db.collection("chatNewmsgNotification").find({"room": chatResult[i].room}).toArray();
console.log("B")
}
});
- 如果出于某种原因您确实喜欢
callback
功能,那么请用 promise
: 包装它
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {
for (i = 0; i < chatResult.length; ++i) {
console.log("A");
await new Promise((resolve, reject) => {
try {
db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
console.log("B");
resolve();
});
} catch (e) {
reject(e)
}
})
}
})
db.collection("influencer_chat_db").find({}).toArray(function(err, chatResult){
for(i=0;i< chatResult.length;++i){
console.log("A");
await db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
console.log("B")
});
}})
我想使用 for 循环从集合 "chatNewmsgNotification" 中检索数据,但是执行是以同步格式进行的。我用简单易懂的方式编写了代码,预期的执行和输出是 A B A B。目前我得到的是 A A B B。
发生这种情况是因为 callback
函数没有绑定到 promise
所以一旦 promise
returns 仍然有一段未知的(小)时间直到callback
函数被调用,这就是循环设法变得更快的原因。
您有两个简单的修复方法:
- 更改查找以在没有回调的情况下工作:
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {
for (i = 0; i < chatResult.length; ++i) {
console.log("A");
await db.collection("chatNewmsgNotification").find({"room": chatResult[i].room}).toArray();
console.log("B")
}
});
- 如果出于某种原因您确实喜欢
callback
功能,那么请用promise
: 包装它
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {
for (i = 0; i < chatResult.length; ++i) {
console.log("A");
await new Promise((resolve, reject) => {
try {
db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
console.log("B");
resolve();
});
} catch (e) {
reject(e)
}
})
}
})