JobRequest.findByJobId
è un'operazione asincrona. Non è possibile bloccare operazioni asincrone in JavaScript, quindi è necessario sincronizzarlo manualmente contando. Esempio (gestione degli errori omesso per brevità):
var results = [];
var pendingJobCount = ids.length;
_.forEach(ids, function(id) {
JobRequest.findByJobId(id, function(err, result) {
results.push(result);
if (--pendingJobCount === 0) callback(null, results);
});
});
Ci sono, naturalmente, costrutti wrapper per fare cose come questa, ma preferisco spiegare come funziona realmente. Controlla dfsq's answer per ulteriori dettagli su uno di questi wrapper, chiamato promesse.
Si noti inoltre che le operazioni asincrone possono essere completate. L'ordine nell'array results
non corrisponde necessariamente all'ordine della matrice ids
. Se avete bisogno di informazioni che collegato, è necessario tenere traccia da soli, ad esempio raccogliendo i risultati in una mappa invece di un array:
var results = {};
var pendingJobCount = ids.length;
_.forEach(ids, function(id) {
JobRequest.findByJobId(id, function(err, result) {
results[id] = result;
if (--pendingJobCount === 0) callback(null, results);
});
});
questo esempio si presuppone che non ci sono duplicati nella vostra ids
array. I risultati per le chiavi duplicate verranno ignorati.
La gestione degli errori potrebbe funzionare in modo simile, inserendo informazioni aggiuntive nel risultato. Un altro esempio:
results.push({id: id, error: null, value: result});
Si dovrebbe usare 'async.map'. – SLaks