1

識別タスクの結果に基づいて、レイヤーの添付ファイルを照会しようとしています。レイヤーに添付ファイルがある場合は、infoTemplate の下部にリンクを追加したいと考えています。

複数の Dojo Deferred オブジェクトの操作に問題があります。戻り値がコンソールに記録されているため、それらが解決されていることはわかっていますが、infoWindow にはデータが取り込まれません。

では、ネストされた複数の deferred を処理する適切な方法は何でしょうか? Deferred Lists は正しい方向への一歩のようですが、この状況でどのようにフォーマットするかはわかりません。

ありがとう、

ジョー

アップデート:

以下の作業コードを更新しました。

map.on('click',executeIdentify);

function executeIdentify(evt) {
  identifyParams.width = map.width;
  identifyParams.height = map.height;
  identifyParams.geometry = evt.mapPoint;
  identifyParams.mapExtent = map.extent;

  var deferred = identifyTask.execute(identifyParams);

  deferred.addCallback(function(deferredResult){
    var promiseList = []
    var features = array.map(deferredResult,function(result) {

      var feature = result.feature;
      var content = "";
      array.forEach(Object.keys(feature.attributes),function(attr) {
        content += attr + ": " + feature.attributes[attr] + "<br>"
      });
      var url = identifyTask.url + "/" + result.layerId + "/" + result.feature.attributes.OBJECTID + "/attachments?f=json"
      var req = esriRequest({url:url}).then(function(newDef) {

        if (Object.keys(newDef).toString() == "attachmentInfos,_ssl") {
          content += "<br><b>Attachments:</b><hr>"
          array.forEach(newDef.attachmentInfos,function(attach) {
            content += "<a href=" + identifyTask.url + "/" + result.layerId + "/" + result.feature.attributes.OBJECTID + "/attachments/" + attach.id + " target='_blank'>" + attach.name + "</a><br>"
          })
        }
        content += "<br><br>";
        console.log(result)
        feature.infoTemplate = new InfoTemplate(result.layerName + " " + result.feature.attributes.OBJECTID,content)
        // console.log(feature)
        return feature
      },function(newDef) {
        feature.infoTemplate = new InfoTemplate(result.layerName + " " + result.feature.attributes.OBJECTID,content);
        // console.log(feature)
        return feature
      });
      promiseList.push(req);
    });
    var promiseAll = new all(promiseList)
    promiseAll.then(function(r) {promiseFun(r)})
  })
  function promiseFun(r) {
    map.infoWindow.setFeatures(r);
    map.infoWindow.show(evt.mapPoint);
  }
}
4

1 に答える 1