2011-07-20 27 views
8

पर जाने से पहले एक लूप में कॉलबैक की प्रतीक्षा कर रहा है मेरे पास एक लूप है जिसमें कॉलबैक के साथ एक एसिंक्रोनस कॉल है। आगे बढ़ने में सक्षम होने के लिए, मुझे लूप के परिणामों को प्रदर्शित करने के लिए, पूरे लूप के माध्यम से कॉल करने के लिए कॉलबैक की आवश्यकता होती है।नोड.जेएस:

हर तरह से मैंने इसे नियंत्रित करने का प्रयास किया है (काम नहीं किया है, चरण, Tame.js, async.js, और अन्य) - आगे बढ़ने के तरीके पर कोई सुझाव?

array = ['test', 'of', 'file']; 
array2 = ['another', 'array']; 

for(i in array) { 
    item = array[i]; 
    document_ids = new Array(); 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     // look it up 
     mongodb.find({item_name: item2}).toArray(function(err, documents { 
      // because of async, 
      // the code moves on and calls this back later 
      console.log('got id'); 
      document_ids.push(document_id); 
     })) 
    } 

    // use document_ids 
    console.log(document_ids); // shows [] 
    console.log('done'); 
} 

// shows: 
// [] 
// done 
// got id 
// got id 

उत्तर

10

आप अपने कॉलबैक आग से पहले दस्तावेज़_आईड्स लॉग कर रहे हैं। आपको यह पता लगाना होगा कि आपने कब किया है, यह जानने के लिए कि आपने कितने कॉलबैक चलाए हैं।

काउंटर का उपयोग करने और प्रत्येक कॉलबैक पर गिनती की जांच करने के लिए एक आसान तरीका है।

अपने उदाहरण ले रहा है

var array = ['test', 'of', 'file']; 
var array2 = ['another', 'array']; 
var document_ids = []; 

var waiting = 0; 

for(i in array) { 
    item = array[i]; 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     waiting ++; 

     mongodb.find({item_name: item2}).toArray(
      function(err, document_id) { 
       waiting --; 
       document_ids.push(document_id); 
       complete(); 
      }) 
     ); 
    } 
} 

function complete() { 
    if (!waiting) { 
     console.log(document_ids); 
     console.log('done');  
    } 
} 
+1

आपको बहुत बहुत धन्यवाद! मैंने इसे async.js की मदद से संशोधित किया और इसे काम कर लिया। –

संबंधित मुद्दे