0

Javascript を使用して、for ループで変更された後に配列の結果を取得します || .forEach || 入り?

問題は、javascript がすべてを非同期で実行することです。そのため、この一見単純な問題の解決策を見つけることができません。

例:

action: function () {
    modelsResult = [];

    Model.forEach(function (model) {
        doSomething(model, function (newModel) {
        modelsResult.push(newModel);
    });

    response.send({
        models: modelsResult
    });
}

var doSomething = function (model, callback) {
    model.id = model.id++;

    callback(model);
}

response.sendforEach が提供するすべてのモデルが modelsResult に含まれる前に実行されます。ただしresponse.send、 forEach 内に配置すると、同じことが起こります。

4

2 に答える 2

2

doSomething が非同期の場合、コードを大幅に再構築する必要があります。非同期操作でシーケンシャル コードを記述して、物事がシーケンシャル パスに従うことを期待することはできません。彼らは単にそうしません。

代わりに、最後の非同期操作がいつ完了したかがわかるようにコードを構造化する必要がdoSomething()あります。その後、response.send()すべての非同期操作の結果を処理できるようになります。

あなたのコードでa が正確に何であるかはわかりませんが、呼び出しでModel何回反復するかを事前に知ることができれば.forEach()、コードは次のように実装できます。

action: function () {
    modelsResult = [];

    // create a count of remaining iterations       
    var cntRemaining = Model.length;

    Model.forEach(function (model) {
        doSomething(model, function (newModel) {

            // save results of this async operation
            modelsResult.push(newModel);

            // one more async operation has completed
            --cntRemaining;

            // if all async calls are done, then process the final result
            if (cntRemaining === 0) {
                response.send({models: modelsResult});
            }
        });
    });

}

var doSomething = function (model, callback) {
    ++model.id;

    callback(model);
}
于 2013-10-25T20:53:03.680 に答える