【问题标题】:Some API calls get failed when i make multiple calls(around 12) using Promise.all当我使用 Promise.all 进行多次调用(大约 12 次)时,一些 API 调用失败
【发布时间】:2020-09-22 14:39:25
【问题描述】:

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

【问题讨论】:

  • 失败了怎么办?你发现一个错误?错误详情是什么?服务器是否有速率限制请求或类似请求?
  • 是的,我遇到了一个错误 500,但是当调用次数较少时,requsets 正常,大约 4 或 5
  • a 500 是您的服务器无法处理请求负载。你的javascript不是问题
  • 如果您使用 Google 429,当服务器上有太多请求以防止其崩溃时,它会被抛出。要么不要一次发出这么多请求,要么与您的服务器管理员交谈以允许它们。
  • 如果是500,那么和客户端无关,可能是多个请求的原因,但是固定需要在你的后端做。

标签: javascript promise axios es6-promise


【解决方案1】:

这是因为 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 });
}

...

【讨论】:

    【解决方案2】:

    我不习惯异步等待,但这应该可以工作

     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
        })
      }, [])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 2020-12-16
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2017-05-20
      相关资源
      最近更新 更多