Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在上一次调用的响应完成之前,等待/异步调用axios_Javascript_Node.js_Reactjs_Api_Promise - Fatal编程技术网

Javascript 在上一次调用的响应完成之前,等待/异步调用axios

Javascript 在上一次调用的响应完成之前,等待/异步调用axios,javascript,node.js,reactjs,api,promise,Javascript,Node.js,Reactjs,Api,Promise,我有一个React组件,它在componentdiddupdate中调用async函数。在该函数中,我有一个项目数组,我称之为Promise.allon。有一种情况是,根据先前的axios调用返回的内容进行axios调用。我遇到的问题是,axios调用是在上一次axios调用的结果完成之前进行的,我不知道为什么会发生这种情况 这是我的密码: class Test extends Component { this.state = { experiments: [] } asyn

我有一个React组件,它在
componentdiddupdate
中调用
async
函数。在该函数中,我有一个项目数组,我称之为
Promise.all
on。有一种情况是,根据先前的
axios
调用返回的内容进行
axios
调用。我遇到的问题是,
axios
调用是在上一次
axios
调用的结果完成之前进行的,我不知道为什么会发生这种情况

这是我的密码:

class Test extends Component {
  this.state = {
    experiments: []
  }
  async componentDidMount() {
    await this.getExperiments(); // function to fetch experiments from a db
  }
  async componentDidUpdate() {
    if (condition) {
      await myFunction()
    }
  }

  myFunction = async () => {
    try {
      const { experiments } = this.state;
      const results = await Promise.all(experiments.map(async experiment => {
        const firstAxiosCall = await axios.get(someUrl);
        const secondAxiosCall = await axios.get(anotherUrl)
        const { data } = secondAxiosCall; // THIS IS WHERE BUG OCCURS
        if (data.length === 0) {  // For one experiment, this is not empty, but it still goes into the if statement.
          await axios.post(thirdUrl)
        }
      }));
    } catch (e) {
      console.log('ERROR', e);
    }
  }
}
我知道这是一个bug,因为if语句中的
axios
调用被调用,我在后端收到一个db错误,表示没有传入任何内容。在继续执行if语句之前,我希望第二个axios调用中的数据首先返回。我做错什么了吗

我希望这是足够的信息


谢谢大家!

我建议您使用这样的方法:

myFunction = async () => {
await axios.all([
    axios.get('http://someurl.com'),
    axios.get('http://anotherurl.com')
  ])
  .then(axios.spread((someUrlRest, anotherUrlRes) => {
    // do something with both responses
  });
}

map()。我建议使用像
bluebird
这样的库来处理异步收集方法。在那里编写代码的方式是,
first axioscall
应该发生,然后
secondAxiosCall
,ahd然后是
{data}
行,然后是
if
。你在等待一切。我怀疑你的问题与你描述的不同try
const{data}=wait secondAxiosCall。我不确定这是否有效,但尝试一下也无妨。@MichaelOssig-常规
for
循环do
wait
(所有类型的
for
循环)。这是一个非常有用的特性
.forEach()
.map()
过滤器()
不要。但是,常规的
for
循环确实有用。@michaelosig-Bluebird在
.map()
中的并发功能仍然非常有用。但是,我发现我不再需要它了。我希望看到Javascript添加一些承诺感知的数组迭代。基金会现在有异步迭代程序。