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.send将在 modelsResult 拥有 forEach 提供的所有模型之前执行。但是,如果我将其response.send放在 forEach 中,那么同样会发生。

4

2 回答 2

2

如果 doSomething 是异步的,那么您将不得不大幅重构您的代码。您不能使用异步操作编写顺序代码并期望事情遵循顺序路径。他们根本没有。

相反,您必须构造代码,以便知道最后一个异步doSomething()操作何时完成,然后,只有到那时,您才能response.send()处理所有异步操作的结果。

我不知道Model你的代码中究竟 a 是什么,但如果我们可以提前知道调用它会有多少次迭代.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 回答
1

许多库可以帮助您解决这个问题。或者您可以在函数中编写自己的小布尔值,该函数仅在索引与长度相同时设置,从而开始您的最终回调......尽管保存一些有趣的工作;我建议看一下 Q 或下划线,有很多不同的方法来实现这一点。

https://github.com/kriskowal/q http://underscorejs.org/#after

于 2013-10-25T21:04:49.230 回答