使用 async/await 和 Promise.all() 对对象数组发出 api 请求

Making api requests on an array of objects using async/await and Promise.all()

我正在创建一个简单的图书搜索应用程序,我发出初始 api 请求以获取图书对象数组,然后我需要对每本书发出 api 请求以得到尺寸。当我 console.log 书的初始数组时,书对象添加了 attribute('height'),但我相信这是因为在我进行 api 调用后数组已更新。然后,当我 console.log 数组在我进行个人 api 调用后,我得到了一组承诺。最后,当我 Promise.all() 承诺数组时,它们都返回 undefined。 我一直在玩 async/await 一段时间,如果您认为可以帮助我弄清楚如何 return 我的一系列具有“高度”属性的书籍,我将不胜感激我添加了个人 api 调用。

    
    searchBook = (event) => {
    event.preventDefault();
    axios
      .get(
        "https://www.googleapis.com/books/v1/volumes?q=" +
          this.state.searchField +
          "&key=" +
          this.state.apiKey
      )
      .then((data) => {
        //fill in missing attributes
        const cleanData = this.cleanData(data.data.items);

        //filter books for specific author
        const filterAuthor = this.filterAuthor(cleanData);

        //add height attribute to book
        const addHeight = this.addHeight(filterAuthor);

        console.log(filterAuthor); //returns array of book objects

        console.log(addHeight); //returns array of promises

        Promise.all(addHeight).then((data) => {
          console.log(data); //returns array of undefined
        });
        //this.setState({ books: addHeight }); 
      });
  };

  //add 'height' attribute to book objects
  addHeight = (data) => {
    const addHeight = data.map(async (book) => {
      await axios
        .get(
          "https://www.googleapis.com/books/v1/volumes/" +
            book.id +
            "?key=" +
            this.state.apiKey
        )
        .then((data) => {
          if (data.data.volumeInfo?.dimensions) {
            book["height"] =
              data.data.volumeInfo.dimensions.height.split(" ")[0] / 2.54; //convert cm to in
          } else {
            book["height"] = "0";
          }
          return book;
        });
    });
    return addHeight;
  };

TLDR

The way I see it, you need to return promise(I mean need to return axios

回答

我认为 promise 对象中没有 return 值。 当你在 const addHeight = data.map(async (book)=> {...}) 处使用 async/await 时,这个回调不能 return 任何东西。所以当你 return axios 时,你的 promise 可以得到正确的数据

例子

 addHeight = (data) => {
    const addHeight = data.map((book) => {
     return axios
        .get(
          "https://www.googleapis.com/books/v1/volumes/" +
            book.id +
            "?key=" +
            this.state.apiKey
        )
        .then((data) => {
          if (data.data.volumeInfo?.dimensions) {
            book["height"] =
              data.data.volumeInfo.dimensions.height.split(" ")[0] / 2.54;
          } else {
            book["height"] = "0";
          }
          return book;
        });
    });
    return addHeight;
  };