提问者:小点点

nodejs中大型项目数组的处理


我有超过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或任何其他方式中快速执行?


共1个答案

匿名用户

这就是你想要的吗?它将与您的第二个解决方案一样工作,但它将在每次插入完成后得到解决

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