使用Axios发出2个连续请求 - 第二个请求取决于1st的响应

时间:2017-11-17 04:18:45

标签: javascript reactjs axios

以下代码不等待" else" 部分在解析之前返回数据。

我在这个代码出错的地方?

                    return request.get(`${<URL1>}`)
                    .then((res) => {
                        if (res1.data[0]) {
                            data1 = res.data[0]};
                        } else {
                            request.get(`${<URL2>`)
                                .then((res2) => {
                                    data1 = res2.data
                                });
                        }
                        return Promise.resolve(data1);
                    })

提前致谢。

4 个答案:

答案 0 :(得分:3)

你可以使用async并等待这里,如下所示:

 async function getData() {
      const firstRequest = await axios.get(`${<URL1>}`);
      data1 = firstRequest.data[0];
      if (!data1){
          const secondRequest = await axios.get(`${<URL2>}`);
          data1 = secondRequest.data;
      }
      return data1;
  }

答案 1 :(得分:3)

那是因为你做错了:)

当程序执行遇到“异步”操作(使用axios发出网络请求)时,它会调度任务并继续执行以下代码行。这包括任何退货声明。

您的回复应出现在'then'子句中:

return request.get(`${<URL1>}`)
    .then((res1) => {
        if (res1.data[0]) {
            data1 = res1.data[0]
            return Promise.resolve(data1);
        } else {
            request.get(`${<URL2>`)
                .then((res2) => {
                    data1 = res2.data
                    return Promise.resolve(data1);
                });
        }
    });

希望这会有所帮助......

克林顿。

答案 2 :(得分:1)

我认为你可以做点什么

function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));

我认为应该有所帮助。您可以阅读更多here

答案 3 :(得分:1)

这是我根据第一个请求返回的值触发请求列表,然后将该数据添加到第一个请求,然后返回的方法。

在我的示例中,我获得了一个事件列表,然后每个事件都有一个id(从第一个axios.get检索),我需要使用该ID来获取事件描述以及随后的axios.get,但这是唯一的附加数据我需要获取每个事件的信息,因此我只需将事件列表中的每个事件简短描述替换为后续axios.get

的详细描述即可
async function getEvents() {
  const events = await axios
      .get(
          eventsUrl,
          config
      )
      .then(res => {
          if (res.status === 200) {
              let events = res.data.events.filter(
                  event => event.status === 'live' || 'completed'
              )
              events.map(event => {
                  event.urlPath = event.name.text.replace(/\s+/g, '-').toLowerCase()
              })
              return events
          }
      })
      .then(async events => {
          const promises = await events.map(event => axios.get(
              `https://www.eventbriteapi.com/v3/events/${event.id}/description`,
              config
          ))
          await Promise.all(promises)
              .then(values => {
                  return events.forEach((event, index) => {
                      event.description.html = values[index].data.description.replace(`<div>${event.description.text}</div>\n`, '')
                      console.log(event.description.text)
                  })
              })
          return events
      })
      .catch(err => {
          console.log(err)
      })
    return await events
}