javascript - 如何在 Javascript 中通知上次 Web 服务调用何时完成?

标签 javascript axios

我想调用这段代码:

this.setState({ // <------------ CODE 1
  pages: pages
});

仅当所有 axios.get('https://graph.facebook.com/v5.0/' + page.id + '/events?access_token=' + accessToken) 完成时。 代码2

如何用Javascript实现它?

let accessToken = response.accessToken
axios.get('https://graph.facebook.com/v5.0/me/accounts?fields=id,name&access_token=' + response.accessToken)
.then(response => {
console.log("test")
let pageList = response.data.data.map(page => {
  console.log("page " + page.id + " " + page.name);
  this.setState({
    page: response.data.data
  });

  var pages = {}; // <------------ CODE 2
  axios.get('https://graph.facebook.com/v5.0/' + page.id + '/events?access_token=' + accessToken)
  .then(response => {
    console.log("test 2");
    var events = {};
    let eventList = response.data.data.map(event => {
      console.log("event " + event.id + " " + event.name);
      events[event.id] = event.name;
    });
    pages[page.id] = [page.name, events];
  })

  this.setState({ // <------------ CODE 1
    pages: pages
  });
})
})

最佳答案

为了等待每一个Promise要在设置状态之前完成,我们可以利用 Promise.all 。然而,如果一个 Promise 拒绝,Promise.all 将取消所有请求。这就是我们添加 .catch(e => e) 的原因,它真正做的就是捕获任何拒绝并将其定期传递给 Promise.all,就像解决的 Promise 一样。

await 结合,我们可以等待 Promise.all,然后循环结果、调用 setState 或任何您真正喜欢的内容。

let accessToken = response.accessToken;
axios
  .get(
    "https://graph.facebook.com/v5.0/me/accounts?fields=id,name&access_token=" +
      response.accessToken
  )
  .then(async pagesResponse => {
    console.log("test");
    let promisesArray = pagesResponse.data.data.map(async page => {
      console.log("page " + page.id + " " + page.name);
      this.setState({
        page: response.data.data
      });

      return axios
        .get(
          "https://graph.facebook.com/v5.0/" +
            page.id +
            "/events?access_token=" +
            accessToken
        )
        .catch(e => e);
    });

    const responses = await Promise.all(promisesArray);
    var pages = {}; // <------------ CODE 2
    responses.forEach((response, i) => {
      console.log("test 2");
      var events = {};
      let eventList = response.data.data.map(event => {
        console.log("event " + event.id + " " + event.name);
        events[event.id] = event.name;
      });
      const page = pagesResponse.data.data[i];
      pages[page.id] = [page.name, events];
    });

    this.setState({
      // <------------ CODE 1
      pages: pages
    });
  });

希望一切都清楚!如果您需要任何进一步的解释,请告诉我。

关于javascript - 如何在 Javascript 中通知上次 Web 服务调用何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957208/

相关文章:

javascript - 无法在 foreach 循环中的 angularjs 中创建对象数组

javascript - 在 CSS/Javascript 中启用 Chrome 标志的方法?

javascript - 如何让 Laravel 5.3 应用程序在 SASS/JS 更改时自动重新加载

javascript - Joomla 网站 - 如果输入的用户的屏幕分辨率较小,则显示一条消息

javascript - 如何在下拉列表选择 ReactJS 中更改对象数组的值

axios - Axios 是如何解析响应数据中的 XML 的?

javascript - Angular 2 - 如何使我的 index.html 文件标题和元标签的关键字和描述动态

javascript - Axios Promise 处理 - 在 react-native 中获取 "Possible Unhandled Promise Rejection - TypeError: Network request failed"

javascript - 使用 window.axios 时 moxios 无法正常工作

json - 如何从 Vuejs 读取 stream+json 响应?