Axios不返回Promise,不同步

时间:2019-06-09 21:48:48

标签: javascript reactjs axios

在我的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能够同步运行,或者至少要等到诺言解决之后再继续。

2 个答案:

答案 0 :(得分:0)

您可以使用bluebirds Promise.map方法来同步执行异步代码。 Foreach是同步功能,因此可以确定下一个循环在第一个循环结束之前就开始了。您也可以使用async await以正确的顺序执行它。这就是我如何使用async awaitPromise.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()编写程序的方式,为什么不尝试使用访存呢?