【发布时间】:2018-03-21 02:59:19
【问题描述】:
我使用的 API 有一个速率限制器,每秒允许 20 个请求。所有请求都是基于 Promise 的,一旦有响应,Promise 将通过 API 数据解析。
问题:
我设置了一个 promiseArray,其中包含 58k 个等待响应的 promise。如此缓慢地增加内存,直到我内存不足。在我的具体情况下,我不需要将解析的数据传递给我的then(),并且数据正在耗尽我所有的 RAM。
代码:
}).then(() => {
// 2. Crawl for all clanprofiles from these leaderboards
const promiseArray = []
for (let i = 0; i < clanTags.length; i++) {
// Resolved data from getClanProfile() is eating up all my RAM
const p = backgroundScheduler.getClanProfile(clanTags[i], true)
promiseArray.push(p)
}
return Promise.all(promiseArray)
}).then(() => {
那么有没有办法在不需要解析数据的情况下等待 promiseArray 解析完成?
【问题讨论】:
-
58,000 个承诺?!在我看来,你需要有一个切入点。如果您收到超过 X 个请求,只需放弃其中的一些。如果您获得这么多的连接,您应该考虑某种负载平衡并在多个节点进程中运行您的服务器。
-
我怀疑这对于原生 Promise 来说是不可能的,因为他们无法知道附加的回调不会使用数据(直到 Promise 本身被 GC'd)。
-
为了避免存储响应数据,你可以做一个 `promiseArray.push(p.then(()=>'success'))' 这应该删除每个承诺携带的数据并且仍然返回一个可用的承诺。应该。我在那里有点模糊,因此评论而不是答案。
-
如果你不需要任何来自 Promise 的结果,为什么还要等待它们?
-
要添加到@SethWhite 的建议,我什至不会返回成功,因为这会导致存储 58k 成功字符串,只需点击 promise resolve
promiseArray.push(p.then(()=> Promise.resolve()))
标签: javascript node.js bluebird