通过JSON迭代依赖于异步调用

时间:2017-09-22 11:59:03

标签: javascript json asynchronous promise geojson

我正在尝试创建一个promise函数,它将遍历geoJSON对象,使用一个存储在占位符值属性旁边的URL-esque属性来调用存储在该地址的数据。 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是我创建的一个promise函数,用于从一个名为ORD的内部地址中提取值,我已经确认它按预期工作。但是,即使添加了setTimeout(function(){console.log(testJson)},6000)来迭代对象后检查对象的状态,也没有设置value属性。

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分: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值与启动时的值不同。在循环中调用promise也不是一个好主意。在封闭中抽象出来。