Potresti provare async modulo per questo. Ha alcuni metodi molto utili per elaborare ogni elemento in una raccolta e offre funzionalità per quando tutta l'elaborazione è terminata.
Ti rimando in particolare alla coda funzione, che ti consente di aggiungere attività a una coda, quindi una volta che tutti gli elementi sono stati elaborati, fai qualcosa.
Ad esempio, potresti fare qualcosa come:
var q = async.queue(function(task, callback) {
// task.doc would contain your individual doc to process
// your insert / update logic goes here...
// Callback signifies you're done with this task
callback();
}, 2) // <--- this number specifies the number of tasks to run in parallel
q.drain = function() {
// this is the queue's callback, called when the queue is empty,
// i.e. when all your documents have been processed.
res.send(statusCode, message);
}
Quindi, se assumiamo che tu abbia il tuo elenco di documenti in una variabile denominata docs , tutto ciò che devi fare per elaborarli tutti è inserirli nella coda.
for (var doc in docs) {
q.push({ doc: docs[doc] }, function(err) {
if (err) console.log(err);
})
}
Protip:è necessario eseguire il push di un oggetto contenente il documento in coda. C'è uno strano errore se provi a passare un oggetto scartato.
Ora, se desideri gli stati specifici per ogni documento che elabori in Mongo, questo è totalmente possibile in questo modo. Finché hai istanziato una struttura dati al di fuori della coda, puoi aggiungere statusCodes (ecc.) ad essa mentre ogni elemento viene elaborato e inviare la struttura al client nella drain della coda funzione. Non dovrebbe essere una seccatura.