gpt4 book ai didi

javascript - 延迟 Promise.all 序列

转载 作者:搜寻专家 更新时间:2023-10-31 23:50:45 25 4
gpt4 key购买 nike

我正在从外部 API 获取数据,但在某些端点上出现以下错误:

reason: getaddrinfo EAI_AGAIN [the url]:443

我只能假设 API 的所有者有某种速率限制器,并且由于所有抓取都是一次性完成的,所以某些 URL 会被阻止。

所以我试图在每次获取之间设置一个延迟,但没有成功。这是我的尝试:

class someClass {
...
dealyedFetch(url) {
return new Promise ((resolve, reject) => {
setTimeout(() => {
fetch(url, (err, res) => {
if (err) return reject(err)
return resolve(res)
})
}, 5000)
})
}

fetchUrls() {
return Promise.all(
this.urlList.map(url => {
return this.dealyedFetch(url)
.then(/* macht krieg */)
.catch(err => ({err, url}))
})
)
}
}

上面的方法不起作用,它似乎一次触发了所有的抓取。请照亮我。

最佳答案

你同时延迟了它们,所以它们都等待 5000 毫秒,然后一起触发。

如果你想把它们串起来,你需要让它们的延迟逐渐变长。您可以通过使用 map 中的索引来增加延迟(例如 500 毫秒):

delayedFetch(url, delay) {                   // ***
return new Promise ((resolve, reject) => {
setTimeout(() => {
fetch(url, (err, res) => {
if (err) return reject(err)
return resolve(res)
})
}, delay) // ***
})
}
fetchUrls() {
return Promise.all(
this.urlList.map((url, i) => { // ***
return this.delayedFetch(url, i * 500) // ***
.then(/* macht krieg */)
.catch(err => ({err, url}))
})
)
}

第一个请求完全不会延迟,第二个是1 * 500 = 500ms,第三个是2 * 500 = 1000ms,等等


旁注:在上面我修复了名称 delayedFetch 中的错字(问题中是 dealyedFetchal 被颠倒了)。

旁注 2:以上内容解决了您实际提出的问题,但您可以考虑一次一个地完成,在这种情况下 this question's answers告诉你怎么做。或者可能是未完成的并发限制,在这种情况下 this question's answers有助于。固定延迟可能不是您的最佳解决方案。

关于javascript - 延迟 Promise.all 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50188253/

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