干扰数据检索

时间:2018-10-16 08:12:25

标签: javascript reactjs async-await

我具有以下三个功能:

async doAction (link, state)
  {
    try {
      let response = await fetch(
        'http://xxx.tld/'+link,
        {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          type:1
        })
      }, {timeout: 500});

      let responseJson = await response.json();

      alert(state)

      switch (state) {
        //somethings
        .
        .
        .
        default:

      }

    } catch (error) {
      //alert(error);
    }    
  }

  async componentDidMount(){
    this.doAction('loadModAdv.php', 1)
  }

  async loadModAdv(object){
     object.map(async (data)=>{
      if(data.status == "1")
      {

        await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1)
      }
    })
  }

在地图中执行“ await this.doAction”时,“ alert(state)”不会按顺序返回数据。

有时是1 2 4,有时是1 4 2

解决方案是什么?

1 个答案:

答案 0 :(得分:1)

要在数组上实现一致/确定性的异步迭代,请考虑使用以下模式更新代码:

async loadModAdv(object){
    for(const data of object) {
        if(data.status == "1") {
            await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1)
        }
    }
}

作为注释,我注意到您使用了map函数进行迭代,但是似乎您没有使用地图的结果,因此在此答案中,我选择了一种基于在for循环上。

如果您想通过这种模式实现“类似于地图的”行为,则可以执行以下操作:

async loadModAdv(object){

    var results = []

    for(const data of object) {
        if(data.status == "1") {
            results.push(await this.doAction(data.fileName, parseInt(data.moduleAdvertise, 10) + 1))
        }
    }

    console.log('data in order ', JSON.stringify(results))
}

希望有帮助!