gpt4 book ai didi

javascript - setTimeout 内的 insertMany 和带有异步函数的 for 循环

转载 作者:行者123 更新时间:2023-12-03 00:57:32 24 4
gpt4 key购买 nike

我正在尝试编写以下代码并使其同步工作,但唯一的问题是它与 console.log 一起正常工作,它会在 1 秒内延迟打印数组中的每个项目,但不适用于以下结构:

for (let i = 0; i < array.length; i++) {
setTimeout(function () {
1.http request via rp or request.get (I receive a huge data array)
2. .map results
3.insert to Mongo via mongoose
}
}

现在我里面有以下代码:

request.get({url: array[i].url}), function (error, body) {
body.map(element => {
//do stuff, it works fine
});
collection.insertMany(body, function (err, docs) {
//#justloggerthings
}

或者我有几乎相同的版本 rp 而不是 request.get默认情况下,我有 mongoose.Promise = global.Promise;

为什么这会导致问题?因为 body.length 是非常庞大的数据集,会占用大量 RAM。 (现在想象 20 多个带有 insertMany 的数组)

因此,Mongo 尝试立即insertMany 来自请求的所有响应(当它们准备好时,没有 1000 秒的延迟)。实际上,这就是为什么我选择 request 而不是 rp (request-promise),但它看起来也是异步的。那么我应该从 npm 选择另一个 http get 模块并切换到它。不用担心吗?

或者我应该包装这个操作来 promise ||创建一个异步函数,并在每次正确完成时在循环内调用它(例如 1000 秒)。在这种情况下,我在 StackOverflow 上发现的唯一实际内容是:

How to insert data to mongo synchronously (Nodejs, Express)

有点过时了。那么有什么想法吗?

最佳答案

好吧,我没有你的实际代码,所以我会用伪代码编写你可以做什么。

const chunkArray = (array, chunkSize) => {
let i,j,chunks = [];
for (i = 0, j = array.length; i < j; i += chunkSize) {
chunks.push(array.slice(i, i + chunkSize));
}
return chunks;
}

for (let i = 0; i < array.length; i++) {
let bigArray = await request('your data url');
// do some mapping or whatever
// then break your large array into smaller chunks
let chunks = chunkArray(bigArray, 10);
let j;
for (j = 0; j < chunks.length; j++) {
await collection.insertMany(chunks[j]);
}

}

关于javascript - setTimeout 内的 insertMany 和带有异步函数的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com