javascript - 如何按顺序/同步进行 API 调用 - EMFILE 错误
问题描述
我正在尝试使用从 GET 请求收到的数据填充数据库。每个请求返回 500 个项目,这反过来向数据库发送 500 个 POST。有 686 个 GET 请求要发出。我遇到的问题是在第三次 GET 之后,我开始接收Error: connect EMFILE
并最终在数据库中只有约 1700 个项目。
我将如何顺序/同步地进行这些 API 调用以避免这种情况?
function getProducts(myUrl) {
axios.get(myUrl, { httpsAgent: agent })
.then(res => {
res.data.products.forEach(product => {
var product = {
'values': {
'2': product.name,
'3': product.display_price,
'4': product.slug
}
};
postProduct(product);
});
})
.catch(err => {
console.log(err);
});
}
function postProduct(product) {
axios.post(huburl, product)
.then(res => {
console.log(res.data);
})
.catch(err => {
console.log(err)
});
}
for (let i = 1; i <= 686; i++) {
var pagedUrl = url + '&page=' + i;
console.log(pagedUrl);
getProducts(pagedUrl);
}
解决方案
这是一个到 async/await 的简单转换,我说过我会在评论中发布。
async function getProducts(myUrl) {
try {
let res = await axios.get(myUrl, {
httpsAgent: agent
});
res.data.products.forEach(product => {
var product = {
'values': {
'2': product.name,
'3': product.display_price,
'4': product.slug
}
};
await postProduct(product);
});
} catch (e) {
console.log(e);
}
}
async function postProduct(product) {
try {
let res = await axios.post(huburl, product);
console.log(res.data);
} catch (e) {
console.log(e);
}
}
for (let i = 1; i <= 686; i++) {
var pagedUrl = url + '&page=' + i;
console.log(pagedUrl);
await getProducts(pagedUrl);
}
推荐阅读
- spring - 测试中的 Http401 但正常使用
- javascript - 调整浏览器视口大小时日期时间格式发生变化
- spring - Spring Security:将 OAuth2 声明与角色映射到保护资源服务器端点
- spring - Spring Boot 中的 ElasticSearch 凭据
- c# - 关于用 tesseract 分析照片
- html - 在使 Angular 路由正常工作时遇到问题
- php - 在 laravel-html 中连接数组
- javascript - 如何从 JSON 形成的数据库进行动态复选框输入
- bash - 如何在bash脚本中增加数字?
- windows - 如何创建 FFMPEG VIDSTAB 批处理脚本 Windows