先于for循环运行的for循环中的第一个获取方法

时间:2019-07-18 00:43:55

标签: javascript reactjs

因此,我正在编写一个程序,要求我对数组中的每个对象依次运行三种获取方法。因为每个方法都设置状态,所以在设置状态后,我将附加一个回调方法,该方法调用下一个函数。

我尝试过幼稚的想法,就是简单地一个接一个地调用函数而没有回调,但是由于每个函数都在修改状态,所以不起作用。

for (let i = 0; i < array.length; i++){
    this.executeA(array[i]);
}

executeA(data){
   fetch('http://localhost:8080/api/a', headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      })
       .then((response) => {
           response.json().then((res) => {
               this.setState({ a: res }, () => {
                   executeB(data);
               });
           });
        })

}

executeB(data){
   fetch('http://localhost:8080/api/b', headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      })
       .then((response) => {
           response.json().then((res) => {
               this.setState({ b: res }, () => {
                   execute(data);
               });
           });
        })
}

executeC(data){
   fetch('http://localhost:8080/api/c', headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      })
       .then((response) => {
           response.json().then((res) => {
               this.setState({ c: res }, () => {
                   console.log(this.state.c);
               });
           });
        })
}

例如,我希望长度为3的数组的操作顺序为A,B,C,A,B,C,A,B,C。而是执行顺序为A,A,A,B,C,B,C,B,C。我不太确定为什么第一个方法在调用任何其他方法之前先对数组中的每个对象执行,因为我认为在设置状态之后,回调方法将移至下一个函数。感谢您的澄清!

3 个答案:

答案 0 :(得分:0)

如果您有希望,应适当使用library(survival) outLst <- Map(function(x, y) { coxph(with(y, Surv(time, status))~ ., data = y) }, data_train_list, os_train_list) ,在for循环中也应使用async/await

await

还要在const someFunc = async () => { for (let i = 0; i < array.length; i++){ await this.executeA(array[i]); } } 中添加async/await

之所以得到//fetch stuff是因为在for循环中,您不必等待第一个AAABBBCCC完成调用第二个A的过程。您只需快速通过所有A

答案 1 :(得分:0)

问题在于Comparable会在调用executeA之后立即返回(不等待传递给它的回调函数返回),并且对所有函数都是如此。为了保持同步,您可以创建新的承诺并在设置状态后履行它们,以下是一个示例:

this.setState

答案 2 :(得分:-1)

我的答案与其他人的答案非常相似,只不过是一个可行的例子。希望对您有所帮助。

//* this part is just for testing
function fetchStuff(key) {
  return new Promise(resolve => {
    setTimeout(() => resolve(Math.random()), Math.random()*1000);
  });
}
//*/

const array = ['A', 'B', 'C'];

async function runFor(elem) {
  //* this part is just for testing
  console.log('runFor', elem);
  this.setState = function(state) {
    console.log('setState', state);
  };
  //*/
  
  await fetchStuff('a').then(res => {
    this.setState({a: res});
  });
  await fetchStuff('b').then(res => {
    this.setState({b: res});
  });
  await fetchStuff('c').then(res => {
    this.setState({c: res});
  });
}

async function main() {
  for (let elem of array) {
    await runFor(elem);
  }
}

main();