在从dojo / -base / array.map返回数组之前等待dojo / request / xhr完成

时间:2017-09-29 15:12:06

标签: javascript dojo arcgis-js-api

我正在修改下面的代码,该代码的结构基于Display IdentityTask results in Popup上的示例。

var deferred = identifyTask.execute(identifyParams).addCallback(function (response) {
  return arrayUtils.map(response, function (result) {
    var feature = result.feature;
    dojoXhr("/trails/trailPopupUses.action",{
      query:{
        parkName: feature.attributes.PARK_NAME,
        trailName: feature.attributes.TRAIL_ASSOC,
      },
      preventCache: true
    }).then(function(data) {
      useString = data;
      return feature;
    }, function(err) {
      featureResultsContent.innerHTML = "An unexpected error occurred: " + error;
    });
  });
});

app.map.infoWindow.setFeatures([deferred]);

我的问题是,在app.map.infoWindow.setFeatures([deferred]);完成初始化identifyTask.execute变量之前,我无法弄清楚如何确保deferred不执行。我曾尝试在几个地方使用.then(),但无法让它工作。 arrayUtils.map函数返回features的数组,这是app.map.infoWindow.setFeatures([deferred]);期望的数组。

1 个答案:

答案 0 :(得分:0)

我没有说清楚arrayUtils.mapdojo/_base/array.map()方法。问题是arrayUtil.map的每次迭代都需要等到dojoXhr调用返回的数据(' dojo / request / xhr')和所需的arrayUtils.map在调用app.map.infoWindow.setFeatures()之前完成。我的解决方案是删除return并在延迟变量上使用.then。我还在sync: true添加了dojoXhr

                var featureArray;
            var deferred = identifyTask.execute(identifyParams);
            deferred.then(function (response) {
                featureArray = arrayUtils.map(response, function (result) {
                    var feature = result.feature;
                    dojoXhr("/trails/trailPopupUses.action",{
                        query:{
                            parkName: feature.attributes.PARK_NAME,
                            trailName: feature.attributes.TRAIL_ASSOC,
                        },
                        preventCache: true,
                        sync: true
                    }).then(function(data){
                        useString = data;
                    });
                    feature.setInfoTemplate(testTemplate);
                    return feature;
                });
                return featureArray;
            }).then(function(featureArray){
                app.map.infoWindow.setFeatures(featureArray);
            });