节点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 函数被调用,这就是循环设法变得更快的原因。

您有两个简单的修复方法:

  1. 更改查找以在没有回调的情况下工作:
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")
    }
});
  1. 如果出于某种原因您确实喜欢 callback 功能,那么请用 promise:
  2. 包装它
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)  
            } 
        })
    }
})