同步获取-ReactJS

时间:2019-10-14 08:51:23

标签: javascript reactjs asynchronous synchronous

在一个函数中,我循环进行提取调用。 完成所有调用后,我需要将值保存到变量中,但对于异步调用而言,这是不可能的。

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 个答案:

答案 0 :(得分:1)

您需要等到诺言解决。用第一种方法返回promise,然后在第二种应用.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');
}

答案 1 :(得分:0)

您可以将代码转换为Promise并使用Promise而不是直接进行Fetch调用。 将每个调用隐藏为一个promises,并使用promise.all()一起执行它们。当所有的诺言都兑现后,它将起作用。