2013-07-12 114 views
2

我在處理for循環中延遲的dojo時遇到了問題。我現在正在努力解決這個問題,但是任何來自更高級別的人的真知灼見都會有所幫助,這是一個多日的事情。似乎Dojo延遲只能解析一次,這會導致它在for循環中廢話。什麼是異步處理多個響應的最佳方式。dojo推遲了for循環

這是我的代碼片段,沒有全局變量在這段代碼之外聲明。

* 編輯:Dojo有一個.then(),它應該處理異步請求。這是否適合任何人,當使用'then()'我可以看到電話開始,但他們從來沒有表現出完成。在那之後我需要添加一個c'deferred.callback'嗎? *

for (var j = 0; j < ident.length; j++) { 
      if(ident[j].url != "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer"){ 
       deferred = ident[j].execute(idParams); 
      } 
      deferred.*then*(function(response){ 
       return dojo.map(response, function(result){ 
        var feature = result.feature; 
        feature.attributes.layerName = result.layerName; 
        //console.log(feature.attributes); 
        lyrIdent.push(feature.attributes); 
        var template = new esri.InfoTemplate("Prefix: ${PREFIX} <br/>Suffix: ${SUFFIX}<br/>Divcode: ${DIVCODE}<br/> lmp: ${LMP} <br/>hmp: ${HMP}"); 
        feature.setInfoTemplate(template); 
        return feature; 
       }); 
      }); 
     } 
+0

您可以添加一些關於您正在嘗試做什麼的背景嗎?您是否嘗試進行多個異步調用,並等待所有人都返回?你在控制檯看到什麼錯誤? – BuffaloBuffalo

+0

@BuffaloBuffalo是的,我正在進行多個異步調用。調用正在進行並且數據正在返回,我可以看到「lyrIdent」數組被填充了數據,但dojo延遲對象沒有返回任何內容,在讀取dojo延遲對象時,它似乎只處理一個單獨的對象數組同步與數組中的多個對象異步 – atlMapper

回答

3

現在你有一個延遲對象的變量。如果你想使多個異步調用,那麼你需要創建多個遞延對象,每一個通話(如果你把它們放在一起,你怎麼會知道當每個不同的呼叫完成?)

var deferreds = []; 
for(var i=0; i<N; i++){ 
    deferreds[i] = your_async_request(); 
} 

一旦你有了你的承諾清單,你應該可以使用all function(或類似的東西)來獲得承諾列表,並將它變成一個單一的承諾,當它們全部完成時就會給出一個結果列表。

require(["dojo/promise/all"], function(all){ 

    all([promise1, promise2]).then(function(results){ 
    // results will be an Array 
    }); 

}); 
+0

謝謝,我使用的是建立在dojo之上的ESRI庫,它們是幾次迭代回來的。我會亂用所有的用法。而且這些調用是在循環中創建的,並且這些函數在循環中按順序調用,因此它們不那麼異步並且更加有序。我沒有在帖子中澄清這一點。感謝您的評論,我將通過一下工作 – atlMapper

+1

@atlMapper:如果您想並行運行所有東西,但所有東西都不可用,但舊版Dojo版本中有類似的功能,但我忘記了名稱(IIRC,它的開啓延遲庫和唯一的問題是,API有點不好)。另一方面,如果您想要按順序運行請求,則需要重寫代碼以使用遞歸而不是for循環。 – hugomg