gpt4 book ai didi

javascript - 折射 : return or push value to new array value from mongoose callback

转载 作者:行者123 更新时间:2023-11-30 14:21:04 35 4
gpt4 key购买 nike

Actually I'm not sure that Title of my question is 'correct', if you have any idea with it, you could leave a comment and I'll rename it.

我正在尝试重写我的旧函数,该函数发出 http 请求并通过 mongoose 在 mongoDB 中插入许多对象。我已经有了它的工作版本,但我在使用它时遇到了问题。基本上,因为当我尝试从 20 多个请求中插入许多 20 个数组时,从一个请求中插入 ~50'000 个元素会导致巨大的内存泄漏。即使使用 MongoDB 优化。

我的代码逻辑:

function main() {
server.find({locale: "en_GB"}).exec(function (err, server) {
for (let i = 0; i < server.length; i++) { //for example 20 servers
rp({url: server[i].slug}).then(response => {
auctions.count({
server: server[i].name,
lastModified: {$gte: response.data.files[0].lastModified}
}).then(function (docs) {
if (docs < 0) {
//We don't insert data if they are already up-to-date
}
else {
//I needed response.data.files[0].url and server[i].name from prev. block
//And here is my problem
requests & insertMany and then => loop main()
})
}
})
}).catch(function (error) {
console.log(error);
})
}
})
}

main()

实际上我已经尝试了很多不同的方法来修复它。首先,我试图在 else 之后添加 setInterval像这样阻止:

setTimeout(function () {
//request every server with interval, instead of all at once
}, 1000 * (i + 1));

但我给自己制造了另一个问题,因为我需要递归我的 main()之后立即运行。所以我不能使用:if (i === server[i].length-1)调用垃圾收集器或重新启动 main()因为不是所有服务器都跳过count验证

或者让我们看看我的另一个例子:

我改for (let i = 0; i < server.length; i++)从第 3 行到 .map并将其从靠近 else 的第 3 行移动阻止但setTimeout不适用于 .map版本,但正如您可能已经了解的那样,脚本失去了正确的顺序,我不能延迟它。

其实我一下子就知道怎么修复了。只需通过 let array_new = [], array_new.push = response.data.files[0].url 重新创建数组即可使用 async/await .但我不是这方面的专家,所以我已经浪费了几个小时。所以现在唯一的问题是我不知道如何return来自 else block 的值

至于现在,我正在尝试在 else 中形成数组 block

function main() {
--added let array_new = [];

[v1]array_new.url += response.data.files[0].url;
[v2]array_new.push(response.data.files[0].url);
return array_new

然后调用array_new阵列通过 .then ,但目前没有一个可以正常工作。所以也许有人会给我提示或向我展示可能对我的情况有用的@Stackoverflow 已经回答的问题。

最佳答案

由于您本质上是在处理 promise ,因此您可以重构函数逻辑以使用异步等待,如下所示:

function async main() {
try {
const servers = await server.find({locale: "en_GB"}).exec()
const data = servers.map(async ({ name, slug }) => {
const response = await rp({ url: slug })
const { lastModified, url } = response.data.files[0]
const count = await auctions.count({
server: name,
lastModified: { $gte: lastModified }
})

let result = {}
if (count > 0) result = { name, url }

return result
}).filter(d => Object.keys(d).length > 0)

Model.insertMany(data)
} catch (err) {
console.error(err)
}
}

关于javascript - 折射 : return or push value to new array value from mongoose callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743394/

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