首页 > 解决方案 > 当我使用 Promise.all 进行多次调用(大约 12 次)时,一些 API 调用失败

问题描述

我想进行多个 API 调用。调用次数为 12,我正在使用 Promise.all 方法。但问题是一些呼叫失败。失败的呼叫次数不固定。有时是 4 次,有时是 2 次或 6 次。但当我过去只打 5 次电话时,它工作正常。任何人都可以帮助解决什么问题。这是我的代码:

const getReturnData = async (item) => {
        const res = await axios.get(`${BASE_URLS.signupBaseUrl}/mutual-funds/nav/${item}`)
        return res;
    }

    const sample = ['call1', 'call2', 'call3', 'call4', 'call5', 'call6', 'call7', 'call8', 'call9', 'call10', 'call11', 'call12']

    useEffect(() => {
        let promises = sample.map(item => {return getReturnData(item)})

        axios.all(promises).then(values => {
            setReturnData(values.map(item => item));
        }).catch(err => {
            setReturnData([])
            throw err
        })
    },[])

标签: javascriptpromiseaxioses6-promise

解决方案


这是因为 Promise.all() 如果在迭代 Promise 对象期间有一个 reject() 调用将失败。

这是一个简单的例子

var p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("p1");
  }, 100);
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("p2");
  }, 100);
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("p3");
  }, 100);
}); 

Promise.all([p1, p2, p3]).then(response=> { 
  console.log("Success", response);
}).catch(err => {
    console.log("Fail", err);
})

上面的控制台日志将是“Fail, p1”,因为 Promise 对象之间存在异常。

因此,您需要单独捕获 API 调用的异常,以便发出所有 API 请求。

const getReturnData = (item) => {
      return axios.get(`${BASE_URLS.signupBaseUrl}/mutual-funds/nav/${item}`).then(response => { return response; }).catch(err => { //handle error here });
}

...

推荐阅读