2012-01-05 29 views
5

Vì vậy, tôi có mã trông giống như sau:Node.js - Chờ cho nhiều chức năng để hoàn thành

var data = someobject; 

for(var x in data){ 
    mongo.findOne({ _id:data[x]._id },function(e,post){ 
     if(post != null){ 

      post.title = 'omg updated'; 
      post.save(function(){ 
       console.log('all done updating'); 
      }); 

     } 
    }); 
} 

// I need all^those functions to be done before continuing to the following function: 
some_function(); 

tôi đã nhìn vào Async thư viện, mà tôi sử dụng cho song song khi tôi có một số thiết lập của chức năng tôi cần chạy 1 lần. Nhưng tôi không chắc chắn làm thế nào để đạt được hiệu quả mong muốn.

Tất cả các chức năng này có thể chạy song song, tôi chỉ cần biết khi nào tất cả được thực hiện.

+0

Tôi không chắc chắn nếu bạn đang tìm kiếm một thư viện phong nha, nhưng nếu bạn chỉ cần một cái gì đó tầm thường, bạn có thể chỉ cần có một bộ đếm: đặt nó vào 'Object.keys (dữ liệu) .length' ban đầu, và giảm nó gọi lại' .save' - khi nó đã đạt đến '0' , chạy 'some_function()'. – pimvdb

+0

@pimvdb sẽ hoạt động (nó chính xác là những gì tôi nghĩ đến), tuy nhiên nó chỉ là một hack nhỏ để có được và chạy, để có được một cách chính xác để thực hiện nó sẽ cần một số hệ thống tin nhắn pub/sub (không để có được quá lộn xộn với các sự kiện và gọi lại) –

Trả lời

8

Đây là một trường hợp hoàn hảo cho Async's forEach phương pháp, mà sẽ thực hiện nhiệm vụ song song trên các phần tử của một mảng và sau đó gọi một gọi lại, ví dụ:

async.forEach(Object.keys(data), function doStuff(x, callback) { 
    // access the value of the key with with data[x] 
    mongo.findOne({ _id:data[x]._id },function(e, post){ 
    if(post != null){ 
     post.title = 'omg updated'; 
     post.save(callback); 
    } 
    }); 
}, function(err){ 
    // if any of the saves produced an error, err would equal that error 
}); 
Các vấn đề liên quan