【问题标题】:Promise.all for array.map with axios带有 axios 的 array.map 的 Promise.all
【发布时间】:2020-08-02 07:27:16
【问题描述】:

我想做的事: 我有一系列书名。例如

var bookTitleArray = ["1984", "clockwork Orange"];

对于这个数组,我想通过 axios 调用 API 并获取每个标题的详细信息。

到目前为止我做了什么: 为此,我创建了一个调用 axios 的 array.map 请求,该请求被包装到一个异步函数中。

axios async 函数如下所示:

async function axiosWrapper (Item){
    var ItemPromise = axios.request({
            url: 'some URL',
            method: 'get',
            baseURL: 'some URL',
            headers: {
                'Authorization': 'some authorization'
            }
          })
    var axiosResult = await ItemPromise;
    return axiosResult
}

我已经控制台记录了 axiosResult,它返回了正确的数据。因此 axios 似乎可以工作

与 promise.all 的异步如下所示:

async function mapWrapper(ArrayToRunThrough){

    var promiseArray = ArrayToRunThrough.map(Item => {
        axiosWrapper(Item)
    })

    var ArrayOfResults = await Promise.all(promiseArray);
    console.log(ArrayOfResults);
}

最后我用我想搜索的书籍数组调用 mapWrapper

mapWrapper(bookTitleArray)

我的经历:不幸的是,我只得到了两个“未定义”数组。

我的假设:我假设 Promise.all / await 不能按预期工作。

我需要帮助:如何在“ArrayOfResults”中的此设置中从 Axios API 调用中获取实际值?

【问题讨论】:

  • 当箭头函数有块体时,即=>{...}你需要明确地做一个return

标签: javascript promise axios es6-promise


【解决方案1】:

您没有在您的map 中返回您的axiosWrapper。 你应该这样做:

async function mapWrapper(ArrayToRunThrough){

    var promiseArray = ArrayToRunThrough.map(Item => {
        return axiosWrapper(Item)
    })

    var ArrayOfResults = await Promise.all(promiseArray);
    console.log(ArrayOfResults);
}

【讨论】:

  • 宾果游戏,就是这样。太感谢了。我认为这不是必需的,因为axisWrapper(Item)本身提供了一个promise,然后在map函数中使用它
  • 如果我想在调用mapWrapper(bookTitleArray) 之后访问ArrayOfResults,我会将return ArrayOfResults 放在console.log(ArrayOfResults) 之后,然后等待resultsToWorkWith = await mapWrapper(bookTitleArray) 等函数的结果。这再次意味着,我还必须将 mapWrapper 包装在异步函数中。还是有更优雅的方式来访问resultsToWorkWith
  • @Geole 是的!但请注意,您只能在 async 函数中使用 await
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 2021-03-17
  • 2021-01-01
  • 2021-01-19
  • 1970-01-01
  • 2020-09-24
  • 2020-09-24
  • 2019-02-05
相关资源
最近更新 更多