【问题标题】:How to properly save async/await axios response into variable如何正确地将 async/await axios 响应保存到变量中
【发布时间】:2019-12-18 15:32:44
【问题描述】:

第三方 API 一次只能处理一个查询字符串。所以我想把多个字符串分成数组。然后我会映射数组,进行 async/await axios 调用并将每个响应对象推送到一个空数组中。

使用下面的代码,最后似乎没有存储数据。我最好的猜测是我不了解如何正确使用 async/await 功能。谁能帮帮我?

app.get("/api/posts", (req, res) => {
  const tags = req.query.tags;
  const fetchData = [];

  const axiosCall = async tag => {
    const response = await axios.get(
      `https://hatchways.io/api/assessment/blog/posts?tag=${tag}`
    );
    fetchData.push(response.data);
    //returns correct response object in an array
    console.log(fetchData);
  };

  tags.split(",").length > 1
    ? tags.split(",").map(tag => {
        axiosCall(tag);
      })
    : axiosCall(tags);

  //Returns empty array
  res.send(fetchData);
});

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    由于 axiosCall 是异步的,你需要等待 promise(s) 解决

    喜欢这个

    app.get("/api/posts", (req, res) => {
        const tags = req.query.tags;
    
        const axiosCall = async tag => {
            const response = await axios.get(`https://hatchways.io/api/assessment/blog/posts?tag=${tag}`);
            return response.data;
        };
    
        Promise.all(tags.split(",").length > 1 ? tags.split(",").map(axiosCall) : [axiosCall(tags)])
        .then(fetchData => res.send(fetchData));
    });
    

    或在任何地方使用 async/await

    app.get("/api/posts", async (req, res) => {
        const tags = req.query.tags;
    
        const axiosCall = async tag => {
            const response = await axios.get(`https://hatchways.io/api/assessment/blog/posts?tag=${tag}`);
            return response.data;
        };
    
        const fetchData = await Promise.all(tags.split(",").length > 1 ? tags.split(",").map(axiosCall) : [axiosCall(tags)]);
        res.send(fetchData);
    });
    

    【讨论】:

    • 谢谢它的工作!所以不需要初始化空数组,看起来就像在地图数组内部,其中 axiosCall 函数被调用,返回 response.data 被附加到数组中?此外,在 tags.split(",").map(axiosCall) 中,它不接受任何参数和索引值。这是使用它的简短形式吗?
    • tags.split(",").map(axiosCall) 等价于 tags.split(",").map((tag, index, array) => axiosCall(tag, index, array)) - 由于您忽略(不要声明所以不要使用)axiosCall 函数中的第二和第三个参数,因此使用较短的没有问题符号
    • 再次感谢您.. 现在我有一个问题,关于如何将它们存储在变量中。最终,我想通过多个查询字符串获取多个对象,并且不重复组合。
    • 对不起@JinmanKim - 不知道你的意思,因为fetchData 一个通过多个查询字符串存储多个对象的变量......每个标签一个
    猜你喜欢
    • 2020-08-02
    • 2018-06-27
    • 1970-01-01
    • 2021-09-22
    • 2020-09-10
    • 2018-09-14
    • 2021-09-07
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多