2017-09-22 20 views
1

geoJSONオブジェクトを反復する約束関数を作成しようとしていますが、そのアドレスに格納されているデータを呼び出すためにプレースホルダ値プロパティとともに格納されているURL-esqueプロパティを使用しています。 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

それは実際に多くの意味をなす、ありがとう!私はまだ完全に非同期のjavascriptの癖に慣れていない、私はこのような小さなものを欠いている – TravisH

関連する問題