2013-09-16 11 views
14

C'è una richiamata per quando il trattino di sottolineatura è terminato è il ciclo _.each perché se io I console log immediatamente dopo ovviamente la matrice che sto popolando con ogni ciclo non è disponibile. Questo è da un ciclo nidificato _.each.Sottolineare callback _.each al termine?

_.each(data.recipe, function(recipeItem) { 
    var recipeMap = that.get('recipeMap'); 
    recipeMap[recipeItem.id] = { id: recipeItem.id, quantity: recipeItem.quantity }; 
}); 
console.log(that.get('recipeMap')); //not ready yet. 
+13

'_.each' è sincrono. Non ha bisogno di una richiamata. Il ciclo terminerà prima che venga raggiunta la tua riga 'console.log'. Se stai invocando le funzioni asincrone * dentro * il '_.each', è un problema diverso. – meagar

+0

'_.each' è sincrono e ritornerà solo dopo che la funzione è stata eseguita su tutti gli elementi. Se 'that.get' è asincrono,' each' non ti aiuterà con quello. – Bergi

risposta

15

La funzione each in UnderscoreJS è sincrona che non richiede un callback quando è finito. Uno ha finito di eseguire i comandi immediatamente successivi al ciclo.

Se si eseguono operazioni asincrone nel loop, si consiglia di utilizzare una libreria che supporta le operazioni asincrone all'interno di ciascuna funzione. Una possibilità è usando AsyncJS.

Qui è la vostra ciclo tradotto a AsyncJS:

async.each(data.recipe, function(recipeItem, callback) { 
    var recipeMap = that.get('recipeMap'); 
    recipeMap[recipeItem.id] = { id: recipeItem.id, quantity: recipeItem.quantity }; 
    callback(); // show that no errors happened 
}, function(err) { 
    if(err) { 
     console.log("There was an error" + err); 
    } else { 
     console.log("Loop is done"); 
    } 
}); 
+0

tuttavia se console qualcosa all'interno di looping, non verrà attivato – Muhaimin

8

Un'altra opzione è quella di costruire la vostra funzione di callback in ogni ciclo l'ultima esecuzione:

_.each(collection, function(model) { 
    if(model.collection.indexOf(model) + 1 == collection.length) { 
     // Callback goes here 
    } 
}); 

Modifica per aggiungere:

Non so come siano i tuoi dati di input/output, ma potresti prendere in considerazione l'utilizzo di _.map invece, se stai semplicemente trasformando/riordinando i contenuti

Problemi correlati