javascript - 当我使用 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
})
},[])
解决方案
这是因为 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 });
}
...
推荐阅读
- dart - 无法为 OutlineButton 设置填充颜色
- r - 在 R 中通过另一个文件循环一个文件
- java - 如何在没有扫描仪多次提示的情况下使用扫描仪检查用户输入
- r - R - ggplot2 geom_tile 创建与热图不同的图形
- html - 如何使用彩色文本框将文本环绕在图像周围?
- nginx-reverse-proxy - Nginx 反向代理到 https 位置导致 ssl_error_rx_record_too_long
- sql-server - 在 SQL Server 中同时执行存储过程时处理锁
- sails.js - 如何使用辅助域访问现有的 Sails 应用程序?
- firebase - 由于未启用不存在的 SDK 而出现 Firebase 模拟器错误
- swift - 将数组数据附加到 Struct 变量中