2012-01-05 5 views
5

Поэтому у меня есть код, который выглядит примерно так:Node.js - Ожидание нескольких функций для завершения

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(); 

Я заглянул в библиотеку асинхронной, который я использую для параллельно, когда у меня есть определенное количество функций I необходимо запустить в 1 раз. Но я не уверен, как добиться желаемого эффекта.

Все эти функции могут работать параллельно, мне просто нужно знать, когда все будет сделано.

+0

я не уверен, что если вы ищете достойная библиотека, но если вам нужно только что-то тривиальное, вы можете просто иметь счетчик: сначала установите его в Object.keys (data) .length' и уменьшите его обратный вызов '.save' - когда он достигнет' 0' , запустите 'some_function()'. – pimvdb

+0

@pimvdb, который работал бы (это было именно то, о чем я думал), однако это просто небольшой взлом, чтобы встать и работать, чтобы получить правильный способ сделать это, потребуется какая-то система pub/sub messaging (не получить слишком беспорядочно с событиями и обратными вызовами) –

ответ

8

Это идеальный случай для Async's forEach метода, который будет выполнять параллельные задачи по элементам массива и затем вызвать обратный вызов, например:

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 
}); 
Смежные вопросы