2

我在处理 for 循环中延迟的 dojo 时遇到问题。我现在正在解决这个问题,但是来自更高级别的人的任何见解都会真正有帮助,这是一个多天的事情。似乎 Dojo deferred 只能解决一次,这导致它在 for 循环中出错。什么是异步处理多个响应的最佳方式。

这是我的片段,在这个片段之外没有声明一些变量的全局变量。

*编辑:Dojo 有一个 .then() 应该处理异步请求。这对任何人来说都是正确的,当使用“then()”时,我可以看到调用开始,但它们从未显示为已完成。之后我需要添加 ac '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;
                });
            });
        }
4

1 回答 1

3

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

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

一旦你有了你的 Promise 列表,你应该能够使用all 函数(或类似的东西)来获取该 Promise 列表并将其转换为一个 Promise,当它们全部完成时返回一个结果列表。

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

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

});
于 2013-07-12T19:11:47.597 回答