在我的react应用程序中,我正在for每个循环内进行axios调用,但是,该程序不等待GET请求的响应,而是执行程序的下一部分。当最终解决诺言时,为时已晚。在axios从其请求返回之前,如何暂停程序的执行。
简而言之,我需要axios返回结果,然后继续以同步方式运行程序的其余部分。
我尝试使用async / await选项,但是似乎没有用。我需要Axios同步运行。
pids.forEach((i1) => loadedContent.forEach((i2, idx) => {
if (i1 === i2.available_versions.version[0].pid || i1 ===
i2.versionPid) {
axios.get(`https://programmes.api.hebel.com/dougi/api/versions?
anshur${i1}`).then((response) => {
xml2js.parseString(response.data, function(err, result) {
loadedContent[idx].nCrid =
result.gui.results[0].vastilp[0].roundup[0].identifier[0]._
alert(loadedContent[idx].nCrid)
//Need it to go into here, however it is bypassing this and
continuing
//on to line 111
});
}).catch(e => {
console.log('error', e);
});
}
}))
我希望axios能够同步运行,或者至少要等到诺言解决之后再继续。
答案 0 :(得分:0)
您可以使用bluebirds Promise.map
方法来同步执行异步代码。 Foreach是同步功能,因此可以确定下一个循环在第一个循环结束之前就开始了。您也可以使用async await以正确的顺序执行它。这就是我如何使用async await
和Promise.map
做到的:
await Promise.map(pids, async i1 => {
await Promise.map(loadedContent, async (i2, idx) => {
if (i1 === i2.available_versions.version[0].pid || i1 ===
i2.versionPid) {
const response = await axios.get(`https://programmes.api.hebel.com/dougi/api/versions?
anshur${i1}`);
xml2js.parseString(response.data, function (err, result) {
loadedContent[idx].nCrid =
result.gui.results[0].vastilp[0].roundup[0].identifier[0]._
alert(loadedContent[idx].nCrid)
});
});
});
答案 1 :(得分:0)
执行异步调用将有效地“暂停”执行,直到该值可用为止。以当前使用.then()编写程序的方式,为什么不尝试使用访存呢?