2017-09-22 7 views
1

placeholder value 속성과 함께 저장된 하나의 URL-esque 속성을 사용하여 geoJSON 객체를 반복하는 promise 함수를 만들어 해당 주소에 저장된 데이터를 호출하려고합니다. json으로 반복 자체가 작동,하지만 내 값이 실제로에서 가져 전에 나는 그것이 해결 되 돌리는 것 제대로 시간의 주요 약속을 얻을 수없는 것.비동기 호출에 의존하는 JSON을 통한 반복

//Here is one feature in my geoJSON object 
    { 
    "type": "Feature", 
    "properties": { 
     "name": "AC4", 
     "url": "/*Removed*/", 
     "values": { 
     "DA_T": { 
      "ORD": "station:|slot:/Drivers/NiagaraNetwork/S_1563/B_1964/B1964_SSC2/points/AC4/MixedAirTemp", 
      "value": "placeholder", 
     } 
     } 
    }, 
    "geometry": { 
     "type": "Polygon", 
     "coordinates": [ 
     [ 
      [102.0,-59.0], 
      [102.0,-73.5], 
      [67.5,-73.5], 
      [67.5,-59.0] 
     ] 
     ] 
    }}, 



    //This is what I currently have for my iterating function 
    function jsonValueFill(json, valueName) { 
    return new Promise (function(resolve, reject){ 
     var i = 0; 
     var k = json.features.length; 
     while (i<k) { 
     console.log('iteration: ' + i) 
     if (json.features[i].properties.values.valueName != undefined){ 
      numFromPoint (json.features[i].properties.values.valueName.ORD) 
      .then(function(output){ 
      json.features[i].properties.values.valueName.value = output 
      }); 
     }; 
     i++; 
     if(i == k) {resolve(json)} 
     } 
    }) 
    }; 

numFromPoint가 나는 당겨 만든 약속의 기능입니다 ORD라고하는 내부 주소에서 값을 가져오고 예상대로 작동하는지 확인했습니다. 그러나 객체를 반복 한 후에 setTimeout (function() {console.log (testJson)}, 6000)을 추가하여 객체의 상태를 잘 확인하더라도 value 속성은 설정되지 않습니다.

답변

1

내가 그것을 간단 될 수 있다고 생각 :

function jsonValueFill(json, valueName) { 
    const promises = json.features.map(feature => { 
    if (feature.properties.values[valueName] !== undefined) { 
     return numFromPoint(feature.properties.values[valueName].ORD) 
     .then(function(output) { 
      feature.properties.values[valueName].value = output 
     }) 
    } 
    }) 

    return Promise.all(promises).then(() => json) 
} 
+0

이것은 완벽하게 작동했습니다. 여러분은 생명의 은인입니다! 도움을 주셔서 감사합니다 :) – TravisH

0
while (i<k) { 
    console.log('iteration: ' + i) 
    if (json.features[i].properties.values.valueName != undefined){ 
     numFromPoint (json.features[i].properties.values.valueName.ORD) 
     .then(function(output){ 
     json.features[i].properties.values.valueName.value = output 
     }); 
    }; 
    i++; 

코드의이 작품에서 참조 numFromPoint가 해결 i 값은 시작했을 때와 다릅니다. 루프를 통해 약속을하는 것도 좋은 생각이 아닙니다. 클로저에서이를 추상화합니다.

+0

그건 실제로 많은 의미가 있습니다, 감사합니다! 난 여전히 비동기 자바 스크립트의 단점에 익숙하지 않다. – TravisH