AXIOS:如何并发运行http请求并在请求失败时获取所有请求事件的结果

Vik*_*sal 3 javascript promise reactjs axios

我试图使服务器同时获取请求,为了做到这一点,我编写了以下函数。

问题

如果单个调用失败,那么我将无法获得其余请求的响应。

export const getAll = async (collection) => {
    return new Promise((resolve, reject) => {
        const requests = collection.map(req => {
            const config = {
                headers: req.headers,
                params: req.params
            }
            return axios.get(req.url, config);
        })

        axios.all(requests)
            .then(axios.spread((...args) => {
                // all succerss
                resolve(args);
            }))
            .catch(function (error) {
                // single call fails and all calls are lost
                reject(error)
            });
    })
}
Run Code Online (Sandbox Code Playgroud)

是否可以获取所有请求的结果,无论失败还是成功?

sky*_*yer 5

换句话说,即使请求失败,您也希望像请求成功一样执行其余代码。

我们假设响应不能是null。然后我们捕获请求的错误并null在本例中返回请求。

export const getAll = async (collection) => {
    const requests = collection.map(req => {
        const config = {
            headers: req.headers,
            params: req.params
        };
        return axios.get(req.url, config).catch(() => null);
    })
    return axios.all(requests);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果你有catch()并且它没有抛出异常,那么所有后续代码都会像 Promise 一样工作,已解决而不是拒绝。

另请注意,您不需要Promiseasync函数中显式返回,因为它会自动发生。更重要的是:由于您没有await内部函数,因此实际上不需要将其标记为async. 最后axios.all返回,Promise这样你就不需要手动resolve/ rejectPromise 了。