2013-09-16 15 views
14

Czy jest wywołanie zwrotne, gdy podkreślenie jest zakończone, to pętla _.each, ponieważ jeśli I console log zaraz potem, to tablica, w której zapełniam każdą pętlę, jest niedostępna. Jest to z zagnieżdżonej pętli _.each.Podkreślenie _.dla wywołania zwrotnego po zakończeniu?

_.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' jest synchroniczne. Nie wymaga oddzwaniania. Pętla zakończy się przed osiągnięciem linii 'console.log'. Jeśli wywołujesz funkcje asynchroniczne * wewnątrz * '_.each', to jest inny problem. – meagar

+0

'_.each' jest synchroniczne i zwróci się dopiero po wykonaniu funkcji na wszystkich elementach. Jeśli 'that.get' jest asynchroniczne,' each' nie pomoże ci w tym. – Bergi

Odpowiedz

15

each funkcja w underscore.js jest synchroniczna, która nie wymagałaby oddzwanianie, gdy jest gotowy. Jeden z nich wykonał polecenia natychmiast po wykonaniu pętli.

Jeśli wykonujesz operacje asynchroniczne w swojej pętli, polecam używanie biblioteki, która obsługuje operacje asynchroniczne w obrębie każdej funkcji. Jedną z możliwości jest użycie AsyncJS.

Oto twoja pętla tłumaczona na 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

Jednak jeśli konsola coś wewnątrz pętli, nie zostanie wyzwolony – Muhaimin

8

Innym rozwiązaniem jest zbudowanie funkcji zwrotnej do każdej pętli w ostatnim wykonania:

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

Edycja dodać:

Nie wiem, jak wyglądają dane wejściowe/wyjściowe, ale można rozważyć użycie zamiast tego _.map, jeśli po prostu przekształcasz/przestawiasz zawartość

Powiązane problemy