16

アンダースコアが終了したときのコールバックはありますか?それは_.eachループです。なぜなら、console log直後に明らかに、各ループで入力している配列が利用できないためです。これはネストされた_.eachループからのものです。

_.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.
4

2 に答える 2

22

UnderscoreJSのeach関数は同期的であり、終了時にコールバックを必要としません。ループの直後のコマンドの実行が完了すると、実行されます。

ループ内で非同期操作を実行している場合は、各関数内で非同期操作をサポートするライブラリを使用することをお勧めします。1 つの可能性は、AsyncJSを使用することです。

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");
    }
});
于 2013-09-16T17:35:07.937 に答える
9

もう 1 つのオプションは、最後の実行時にコールバック関数を each ループに組み込むことです。

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

編集して追加:

入力/出力データがどのように見えるかはわかりませんが_.map、コンテンツを変換/再配置するだけの場合は、代わりに使用することを検討してください。

于 2014-11-24T15:56:19.817 に答える