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")
    });
  }})

मैं लूप का उपयोग करके संग्रह "chatNewmsgNotification" से डेटा पुनर्प्राप्त करना चाहता हूं, हालांकि निष्पादन सिंक्रोनस प्रारूप हो रहा है। मैंने कोड को समझने में आसान तरीके से बनाया है, अपेक्षित निष्पादन और आउटपुट ए बी ए बी है। वर्तमान में मुझे ए ए बी बी के रूप में मिल रहा है।

1
shyamrag cp 7 अप्रैल 2020, 18:28

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा इसलिए होता है क्योंकि callback फ़ंक्शन promise के लिए बाध्य नहीं है, इसलिए एक बार promise के लौटने के बाद भी 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 के साथ लपेटें:
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)  
            } 
        })
    }
})
0
Tom Slabbaert 8 अप्रैल 2020, 06:03