繁体   English   中英

当我使用 Promise.all 拨打多个电话(大约 12 个)时,一些 API 调用失败

[英]Some API calls get failed when i make multiple calls(around 12) using Promise.all

我想打多个 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
        })
    },[])

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

这是一个简单的例子

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);
})

上面的控制台日志将是“失败,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 });
}

...

我不习惯 async-await 但这应该可以

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

  useEffect(() => {
    let promises = sample.map(item => {
      return new Promise((resolve, reject) => {
        try {
          const res = axios.get(`${BASE_URLS.signupBaseUrl}/mutual-funds/nav/${item}`)
          resolve(res)
        } catch (err) {
          reject(err);
        }
      })

    })

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM