Синхронная выборка - ReactJS - PullRequest
0 голосов
/ 14 октября 2019

В цикле функции, в которой я делаю вызовы выборки. Когда все вызовы завершены, мне нужно сохранить значения в переменной, но я не могу быть асинхронным с вызовами.

getReportsGroup(bukrs){

    //TOTAL DE UN GRUPO DE PROYECTO
    fetch('api/Reports/GetDataIRPA?SETCLASS=' + this.state.SETCLASS ', {
        method: 'GET',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        }
    })
    .then(response => response.json())
    .then(data => {
       this.setState({
           reportIRPA: data
       });
     });
}

getTotalProjects(){
   //Recorrer proyectos seleccionados
   for (var i = 0; i < this.state.selectProjects.length; i++) {
       this.getReportsGroup(this.state.selectProjects[i].bukrs);
   }

   console.log('finish all fetch');
}

Функция getTotalProjects выполняет цикл, в которомgetReportsGroup называется (выборка производится здесь). В конце всех выборок мне нужно отобразить сообщение в getTotalProjects. В настоящее время, будучи асинхронным, он выполняет console.log('finish all fetch') перед завершением всей выборки.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вам нужно подождать, пока обещание не будет выполнено. Верните обещание в первом методе и примените .then во втором

getReportsGroup(bukrs){

    //TOTAL DE UN GRUPO DE PROYECTO
    return fetch('api/Reports/GetDataIRPA?SETCLASS=' + this.state.SETCLASS ', {
        method: 'GET',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        }
    })
    .then(response => response.json())
    .then(data => {
       this.setState({
           reportIRPA: data,
       });
     });
}

getTotalProjects(){
   //Recorrer proyectos seleccionados
   var promises = []; //array of promises
   for (var i = 0; i < selectProjects.length; i++) {
       var promise = this.getReportsGroup(selectProjects[i].bukrs); //single promise
       promises.push(promise);
   }
   Promise.all(promises ).then(function() {
      console.log("DISPLAY your Message here"); // display here
  });
   console.log('finish all fetch');
}
0 голосов
/ 14 октября 2019

Вы можете преобразовать свой код в обещания и использовать обещания вместо прямых вызовов Fetch. Преобразуйте каждый вызов в обещания и используйте обещание. Все (), чтобы выполнить их все вместе. Который будет работать, когда все обещания будут выполнены.

...