【发布时间】:2022-01-04 17:56:05
【问题描述】:
我想不断地从网站同步数据,但我只有 300 个电话/15 分钟。因此,我认为我可以将我所有的同步请求(大约 1000 个)放入一个数组中,然后每 15 分钟解决其中的 300 个,直到请求数组为空,然后重新开始。但是,当我执行以下操作时:
let requests = []
params = 'invoice-items?invoice_id='
let positions = null
for (const invoice of invoices) {
requests.push(new Promise(async (resolve, reject) => {
positions = await getBillomatData(params + invoice.id, null, 0, null)
await updateDatabase(positions, models.billomat.Position)
}))
}
console.log(requests[0])
await requests[0]
console.log(requests[0])
只要我在 requests[0] 处等待请求,它就会执行所有请求,并且我会超出调用限制。
【问题讨论】:
-
承诺执行器会立即运行,无论您是否、在何处以及何时等待承诺。只是在需要它们之前不要构造承诺,而是在循环本身中等待(睡眠)。
-
正如@Bergi 提到的,您必须异步构建您的承诺。换句话说,您每 3 秒建立一次承诺。然后它可能会或可能不会变得更加复杂,具体取决于您的期望。有些承诺可能需要不到 3 秒的时间来解决,有些可能需要更长的时间。因此,时间尺度上的响应重叠可能会发生,例如在从服务器获得更新鲜的状态之后获得旧状态,这基本上是另一个问题。
标签: javascript node.js api asynchronous