dojo使用for循环延迟

kx5bkwkv  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(238)

我在for循环中处理一个延迟的Dojo时遇到了麻烦。我现在正在解决这个问题,但是任何高层人士的见解都会很有帮助,这已经是一个多天的事情了。似乎Dojo延迟只能解决一次,这会导致它在for循环中崩溃。异步处理多个响应的最佳方法是什么?
这是我的代码片段,没有全局变量,一些变量在代码片段之外声明。

edit:Dojo有一个.then(),它应该处理异步请求。当使用'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;
                });
            });
        }
zfycwa2u

zfycwa2u1#

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

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

});

相关问题