循环中使用async await如何做到分段返回
发布于 7 年前 作者 huangsav 5754 次浏览 来自 问答

刚接触Nodejs,想问下,我有一个循环去读取数据的function,数据量有几百万,我不知道具体多少,用了while(true){},读取到最后然后退出,我在循环里用了一个async ()=>{ await function() {return promise}} 如果这样,会爆掉V8内存,请问如何分段去保存数据到数据库?比如我想每50条就保存一次。谢谢。

11 回复
async () => {
	await function() {
		if (n > 10) {
			await	SaveToDataBase;
		}
		return promise
	}
}

@wolfFN 问题应该不在保存数据这里,而是await要循环几百万次,会一直等待,直到V8内存爆掉。我的意思是想每循环一定数量的await就处理掉这部分取到的数据然后释放掉,再往下循环。

数据从哪里读的?另一个数据库?

有一种东西叫迭代器



const arr = [];
for(let i  = 0;i < 1000000000000;i++)
{
	const data = await doSomeThing();
	arr.push(data);
	if(i % 50 === 0 && i !== 0){
		await db.save(data);
	}
}

用yield,generator,自己写个自执行器。像co那种,不过这个自执行器有个计数器,累计50次后写入数据库,

来自酷炫的 CNodeMD

@cheetahhh 用superagent写了个函数从其他网站读取过来的。

@Fov6363 这个会一直在 await doSomeThing()这里等待1000000000000条数据才继续执行的

@Fov6363 不好意思好像是我将循环放在async外面了

@zswnew async await在typescript编译后就是转成yield的。

@nullcc 用generator写的迭代器吗?

回到顶部