dojo延迟了for循环

时间:2013-07-12 15:42:54

标签: asynchronous for-loop dojo deferred

我在处理for循环中延迟的dojo时遇到问题。我现在正在努力解决这个问题,但是高层人士的任何见解都会有所帮助,这是一个多天的事情。似乎Dojo deferred只能解析一次,这会导致它在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;
                });
            });
        }

1 个答案:

答案 0 :(得分:3)

现在,您有一个延迟对象的变量。如果你想进行多个异步调用,那么你需要创建多个Deferred对象,每个调用一个(如果你把它们放在一起,你怎么知道每个不同的调用何时完成?)

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
  });

});