Javascript 在上一次调用的响应完成之前,等待/异步调用axios
我有一个React组件,它在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
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
。你在等待一切。我怀疑你的问题与你描述的不同tryconst{data}=wait secondAxiosCall代码>。我不确定这是否有效,但尝试一下也无妨。@MichaelOssig-常规for
循环dowait
(所有类型的for
循环)。这是一个非常有用的特性.forEach()
,.map()
,过滤器()
不要。但是,常规的for
循环确实有用。@michaelosig-Bluebird在.map()
中的并发功能仍然非常有用。但是,我发现我不再需要它了。我希望看到Javascript添加一些承诺感知的数组迭代。基金会现在有异步迭代程序。