2011-07-20 28 views
8

üzerinde harekete geçmeden önce döngüde geri aramaların bekletilmesi Geri aramada bir eşzamansız çağrının olduğu bir döngü var. Devam edebilmek için, döngünün sonuçlarını görüntülemek için, tüm döngü boyunca tüm döngü boyunca ateş etmek için geri çağırma ihtiyacım var.Node.js:

Bunu kontrol etmek için her şekilde denedim işe yaramıyor (Adım, Tame.js, async.js ve diğerlerini denediniz) - nasıl ilerleyeceğinize dair öneriler var mı?

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 

cevap

10

Sen geri aramaları yangından önce document_ids giriş ediyoruz. İşiniz bittiğinde kaç tane geri arama yapacağınızı takip etmelisiniz.

Kolay bir yöntem sayacı kullanmak ve her geri aramada sayımı kontrol etmektir.

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

Çok teşekkür ederim senin örneğin alarak! Bunu async.js yardımıyla değiştirdim ve işe yaradım. –