Помехи в поиске данных - PullRequest
       4

Помехи в поиске данных

0 голосов
/ 16 октября 2018

У меня есть три функции, как показано:

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 голосов
/ 16 октября 2018

Чтобы добиться согласованной / детерминированной асинхронной итерации по массиву, рассмотрите возможность обновления вашего кода для использования следующего шаблона:

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))
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...