2013-10-25 112 views
0

使用Javascript 在for循環中修改數組後得到數組的結果|| .forEach ||換嗎?在for循環中修改後獲取數組的結果

問題是,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中,那麼也會發生同樣的情況。

+0

是這些操作異步的?如果是這樣,請告訴我們哪些是因爲完全改變了代碼流。 – jfriend00

+0

此外,您似乎缺少如此接近的大括號,因此不清楚執行流程如何。請更正缺失的大括號並修正縮進,以便我們可以跟蹤代碼的流程。 – jfriend00

+0

doSomething是異步的。試圖清除exe流 – dylanmensaert

回答

2

如果doSomething是異步的,那麼你將不得不重構你的代碼。您不能使用異步操作編寫順序代碼,並期望事物遵循順序路徑。他們根本就沒有。

相反,您必須構建代碼,以便知道何時最後一個異步doSomething()操作已完成,然後才能執行所有異步操作的結果response.send()

我不知道究竟一個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); 
} 
+0

我根本無法以可以解決我的問題的方式重組代碼。猜猜那裏不存在一個。想要首先在論壇上提問,但總是有可能我錯過了一些簡單的東西:/ – dylanmensaert

+0

@ user1933169 - 我已經添加了一個示例,說明如何重構代碼以解釋異步操作。 – jfriend00

1

很多libs可以幫助你做到這一點。或者你可以在函數中編寫自己的小布爾值,只有當索引與長度相同時纔會設置該布爾值,從而開始執行最後的回調操作。我建議看看Q或下劃線,有很多不同的方法來實現這一點。

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