2013-06-02 1 views
0

Я пытаюсь использовать средство идентификации на уровне службы динамической карты и отображать информационное окно, в котором отображаются изображения, прикрепленные к записям. Мне нужно обезьяна обойти и получить функциональный слой, но это работает нормально. У меня проблема с отсрочкой.ArcGIS Javascript Идентифицирует задачу и откладывает

В этом проблема: задача идентификации возвращает объект отложенного додзё. У меня есть обратный вызов, который я запускаю, когда отложен запрос. В этой функции обратного вызова я запускаю еще одну функцию, называемую queryAttachmentInfos. Когда это запустится, строка «return feature» будет срабатывать перед функцией queryAttachmentInfos. Я не знаю почему. Не должно ли все в обратном вызове синхронно? Как заставить функцию обратного вызова ждать завершения queryAttachmentInfo? Я использую setTimeout, чтобы заставить сценарий ждать одну секунду, которая работает иногда, но я знаю, что это нехорошее решение.

Любая помощь будет радушна.

код ниже ...

function executeIdentifyTask(evt) { 
     identifyParams.geometry = evt.mapPoint; 
     identifyParams.mapExtent = map.extent; 

     var deferred = identifyTask.execute(identifyParams); 

     deferred.addCallback(function(response) {  

      return dojo.map(response, function(result) { 
      var feature = result.feature; 
      var fLayerPath = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0" 
      var featureLayer = new esri.layers.FeatureLayer(fLayerPath); 
      var objID = feature.attributes.OBJECTID; 
      feature.attributes.layerName = result.layerName; 
      //alert(result.layerId); 
      if(result.layerName === 'Tax Parcels'){ 
       featureLayer.queryAttachmentInfos(6737858, function (infos) { 
          if (infos.length>0) { 
           el = document.createElement('img'); 
           el.setAttribute('src', infos[0].url); 
           t = document.createElement('table'); 

           //first row Request Type 
           r = t.insertRow(0); 
           r.bgColor="#00FFFF"; 
           c = r.insertCell(0); 
           c1 = r.insertCell(1); 
           c.innerHTML="Request Type"; 
           c1.innerHTML=feature.attributes.building; 

           //second row District 
           r1 = t.insertRow(-1); 
           c2 = r1.insertCell(0); 
           c2_1 = r1.insertCell(1); 
           c2.innerHTML="District"; 
           c2_1.innerHTML=feature.attributes.UNIT; 


           //third row Status 
           r2 = t.insertRow(-1); 
           r2.bgColor="#00FFFF"; 
           c3 = r2.insertCell(0); 
           c3_1 = r2.insertCell(1); 
           c3.innerHTML="Status"; 
           c3_1.innerHTML=feature.attributes.PARCELID ; 

           var len = infos.length; 
            for (var i = 0; i < len;i++) 
            { 
             newRow = t.insertRow(-1); 
             newCell = newRow.insertCell(0); 
             newCell.colSpan=2; 
             newCell.innerHTML="<a href="+infos[i].url+"/><img src="+infos[i].url+"/>"; 
             //els[i]= document.createElement('img'); 
             //els[i].setAttribute('src', infos[i].url); 

             //alert(infos[i].url); 

            } 
           var template = new esri.InfoTemplate("", t); 
           feature.setInfoTemplate(template); 
           //return feature; 
          } 
         else 
         { 
          var template = new esri.InfoTemplate("", "${Postal Address} <br/> Different: ${First Owner Name}"); 
          feature.setInfoTemplate(template); 
          //eturn feature; 
         } 
         }); 
       console.log(feature.attributes.PARCELID); 

      } 
      else if (result.layerName === 'Building Footprints'){ 
       var template = new esri.InfoTemplate("", "Parcel ID: ${PARCELID}"); 
       feature.setInfoTemplate(template); 
       //return feature; 
      } 
      return feature; 
      }); 
     }); 
     setTimeout(function(){map.infoWindow.setFeatures([ deferred ])},1000); 
     map.infoWindow.show(evt.mapPoint); 
     } 
+0

«Разве все в обратном вызове происходит синхронно?» Не обязательно. Асинхронный обратный вызов может сам содержать асинхронные операции. –

ответ

1

Проблема, кажется, что featureLayer.queryAttachmentInfos() сам асинхронный так, в случае «налоговая Посылки», map.infoWindow.setFeatures() и map.infoWindow.show() можно назвать только тогда, когда что асинхронная деятельность завершена ,

Между тем, в случае «строительных следов» map.infoWindow.setFeatures() и map.infoWindow.show(evt.mapPoint) можно назвать синхронно (в пределах внешнего асинхронного обратного вызова).

Это означает, что имеется небольшой блок кода, который следует вызывать из двух мест. Можно повторить несколько строк коды или написать функцию работника следующим образом:

var showInfoWindow = function(feature, tpl) { 
    // A utility function which creates and populates an infowindow 
    // and shows it at evt.mapPoint 
    feature.setInfoTemplate(new esri.InfoTemplate("", tpl)); 
    map.infoWindow.setFeatures(feature); 
    map.infoWindow.show(evt.mapPoint); 
} 

А вот в контексте (со всем крупногабаритным DOM здания удалены для ясности):

function executeIdentifyTask(evt) { 
    identifyParams.geometry = evt.mapPoint; 
    identifyParams.mapExtent = map.extent; 

    var showInfoWindow = function(feature, tpl) { 
     // A utility function which creates and populates an infowindow 
     // and shows it at evt.mapPoint 
     feature.setInfoTemplate(new esri.InfoTemplate("", tpl)); 
     map.infoWindow.setFeatures(feature); 
     map.infoWindow.show(evt.mapPoint); 
    } 

    var deferred = identifyTask.execute(identifyParams); 

    deferred.addCallback(function(response) { 
     return dojo.map(response, function(result) { 
      var feature = result.feature; 
      //var objID = feature.attributes.OBJECTID;//??? 
      feature.attributes.layerName = result.layerName; 
      if(result.layerName === 'Tax Parcels') { 
       var fLayerPath = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0"; 
       var featureLayer = new esri.layers.FeatureLayer(fLayerPath); 
       featureLayer.queryAttachmentInfos(6737858, function(infos) { 
        var t, tpl; 
        if(infos.length > 0) { 
         t = document.createElement('table'); 
         //***** Reinsert several lines of code here ***** 
         //***** Remember to localize variables with `var` ***** 
         tpl = t; 
        } 
        else { 
         tpl = "${Postal Address} <br/> Different: ${First Owner Name}"; 
        } 
        showInfoWindow(feature, tpl);//<<<<< create, populate and display an infowindow 
       }); 
      } 
      else if (result.layerName === 'Building Footprints') { 
       showInfoWindow(feature, "Parcel ID: ${PARCELID}");//<<<<< create, populate and display an infowindow 
      } 
      //return feature;//??? 
     }); 
    }); 
} 

Всех I» вы сделали, чтобы перетасовать вещи без каких-либо особых знаний о додзе или дуги. Ошибки с ошибкой со своей стороны, все должно работы. Тем не менее, я только смог проверить наличие синтаксических ошибок, поэтому будьте готовы к некоторой отладке. И не забудьте снова вставить громоздкие линии для построения таблицы.

+0

Вы правы, запросAttachmentInfos отложен. Я этого не понимал. Я не думаю, что решение будет работать, потому что showInfoWindow нужно вызывать вне функции обратного вызова. Задача идентификации может возвращать массив значений (см. Строку «return dojo.map»). – bdwyer

+0

Я предполагаю, что имею дело с вложенными отсрочками. Внешний (отложенный.обратный вызов) и внутренний (queryAttachmentInfo). Есть ли способ заставить внешний ждать внутреннего? – bdwyer

+0

bd, вы говорите, что вы думаете, что мой код не работает или что он не работает? Что произойдет, если вы запустите его? Нет очевидной проблемы, связанной с тем, что должно препятствовать работе 'showInfoWindow' -' feature' и 'tpl' передаются ему, а все остальное (' esri', 'map' и' evt') должно быть автоматически доступно, если только ваш исходный код был неверным в этом отношении. Насколько я могу судить, не будет никакого преимущества, чтобы обратить вспять внутреннюю и внешнюю отсрочки. Если 'identTask' может возвращать массив значений, то это еще одна проблема, не предсказуемая из исходного вопроса. –

0

B-B, Я пробовал код, и я не мог заставить его работать. Похоже, что он должен работать, или, по крайней мере, должен отображать на карте инфо-окно. Пройдя через него, все объекты, необходимые для отображения окна, заполняются. Не знаю, почему это не так.

Прошу прощения, если я не был ясно в своем первом посте. Одна из проблем заключается в том, что задача идентификации может (и обычно) возвращать массив функций.

Каждый взгляд на него, «map.infoWindow.setFeatures ([отложен]]; перед пожаром запускается запросAttachmentInfo. У меня есть тупой обходной путь, когда я использую функцию window.setTimeout, чтобы подождать одну секунду, но это не гарантирует, что все queryAttachmentInfos будут разрешены.

Смежные вопросы