gpt4 book ai didi

javascript - 在 Node.js 中请求信息时延迟 Promise 请求

转载 作者:行者123 更新时间:2023-12-02 22:04:38 24 4
gpt4 key购买 nike

我正在使用gpapi库,以便查找 Play 商店并存储有关在 Play 商店中找到的应用程序的信息。我首先查找某个应用程序的相关应用程序(大约 20 个应用程序),然后请求有关每个应用程序的详细信息。这是图书馆根据 promise 请求完成的。我尝试在请求之间添加延迟,因为在当前状态下,所有请求都是同时执行的,因此我收到了 429 错误(请求太多),过了一会儿,我被暂时完全禁止使用 Google 服务器。

function getRelatedApps(pkg) {
api.login()
.then(function () {
api.related(pkg).then(function (res) {
for (let key in res['0'].child) {
let appId = res['0'].child[key].docid;
if (!storedApps.has(appId)) {
relatedArray.add(appId);
}
}

Promise.map(relatedArray, function (appId) {
getInfo(appId);
}, {concurrency: 1});
});
});
}

我尝试在每个请求之间添加 Promise.delay 并使用 setTimeout 函数,但没有任何效果,因为请求仍然同时执行。

当使用内部带有setTimeout的while循环时,一般不会执行任何请求。

如何在每次调用 getInfo 函数之间暂停?

最佳答案

如果您使用的是 Bluebird,那么您可以使用 Promise.map()Promise.delay(),您可以执行以下操作:

function getRelatedApps(pkg) {
return api.login()
.then(() => api.related(pkg))
.then(res => {
let relatedArray = Object.values(res['0'].child)
.map(value => value.docid)
.filter(appId => !storedApps.has(appId));
return Promise.map(relatedArray, appId => Promise.delay(1000, getInfo(appId)), {concurrency: 1});
});
}

否则,您可以使用自制的 delay() 函数和 Array.prototype.reduce() 实现相同的效果模式,如下:

function delay(ms, val) {
return new Promise(resolve => {
setTimeout(() => { resolve(val); }, ms);
});
}
function getRelatedApps(pkg) {
return api.login()
.then(() => api.related(pkg))
.then(res => {
return Object.values(res['0'].child)
.map(val => val.docid)
.filter(appId => !storedApps.has(appId));
.reduce((p, appId) => p.then(() => delay(1000, appId)).then(getInfo), Promise.resolve());
});
}

注释:

  1. Object.values()从 Node.js 7.0.0 开始可用。对于早期版本的 Node,请恢复为按照问题中的方式构建 latedArray
  2. 假设问题的 latedArray 最初为空。
  3. 根据需要调整 1000 毫秒延迟。

关于javascript - 在 Node.js 中请求信息时延迟 Promise 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755316/

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