我有超过100个项目的阵列。每个项目都点击一个URL。从项目的特定url获得响应后,我会在数据库中插入选项。
如果我使用异步等待,那么我必须等到100个项目获得processD。但是如果我进行异步操作,那么我得到了响应,但是作为异步行为,db中的数据在所有进程完成之前是不可见的。
示例1:使用异步等待
var loc = async(locations){
return new Promise((resolve,reject) => {
try{
for(let item of locations){
var response = await html(location.url);
await insertDB(response);
}
}catch(e){
console.log('error : ',e);
}
resolve('All operation completed successfully');
})
}
loc(位置);
位置是数组的项目在这我将得到响应只有当所有的请求得到完成。
示例2:异步
var loc = (locations){
return new Promise((resolve,reject) => {
locations.forEach(location => {
html(location.url,(res) => {
insertDB(response,(rows) => {
});
});
})
resolve('All operation completed successfully');
})
}
loc(位置)
这里我将立即得到响应,但击中和插入的过程将在后台处理。
考虑到示例1,我们是否可以将循环请求划分为子进程,从而使其在nodejs或任何其他方式中快速执行?
这就是你想要的吗?它将与您的第二个解决方案一样工作,但它将在每次插入完成后得到解决
var loc = (locations){
return new Promise((resolve,reject) => {
const promises = locations.map(async (location) => {
try {
var response = await html(location.url);
await insertDB(response);
} catch(e) {
console.log('error : ',e);
}
})
await Promise.all(promises);
resolve('All operation completed successfully');
})
}
应该有区别。您能帮我测试一下性能时间吗?
solution1()作为您的第一个解决方案函数
solution2()作为我的解决方案函数
console.time('solution1');
await solution1(locations);
console.timeEnd('solution1');
console.time('solution2');
await solution2(locations);
console.timeEnd('solution2');
假设insertDB开销100ms~200ms,平均=150ms
解决方案1:
运行循环1,等待insertDB->;运行循环%2,等待insertDB
时间=150ms+150ms=300ms
解决方案2:
运行循环%1,不等待InsertDB->;运行循环2,不等待insertDB
直到所有insertDB完成,然后解析
时间=150ms
因为所有insertDB启动而不等待另一个insertDB
信用:https://stackoverflow.com/A/556993392/13703967