Javascript 在Node.js中请求信息时延迟承诺请求
我使用该库查找Play Store,并存储有关Play Store上找到的应用程序的信息。我首先查找一个应用程序的相关应用程序(大约20个应用程序),然后请求每个应用程序的详细信息。这是由库按照promise请求完成的。我尝试在请求之间添加延迟,因为在当前状态下,所有请求都同时执行,因此我得到一个429错误(请求太多),过了一段时间,我暂时被Google服务器完全禁止Javascript 在Node.js中请求信息时延迟承诺请求,javascript,node.js,promise,google-play,request-promise,Javascript,Node.js,Promise,Google Play,Request Promise,我使用该库查找Play Store,并存储有关Play Store上找到的应用程序的信息。我首先查找一个应用程序的相关应用程序(大约20个应用程序),然后请求每个应用程序的详细信息。这是由库按照promise请求完成的。我尝试在请求之间添加延迟,因为在当前状态下,所有请求都同时执行,因此我得到一个429错误(请求太多),过了一段时间,我暂时被Google服务器完全禁止 function getRelatedApps(pkg) { api.login() .then(fun
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});
});
}
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());
});
}
否则,您可以使用自产的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});
});
}
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());
});
}
注:
relatedArray
relatedArray
最初为空尝试类似->
返回承诺。延迟(1000)。然后(()=>getInfo(appId))
ps。不要忘记返回,否则地图将立即转到下一个。事实上,记住返回所有承诺。。例如api.login()
->return-api.login()
,api.related()
->return-api.related()
Promise.map(
->return-Promise.map(
etc,否则您违反承诺的行为将发生变化,错误承诺完成将被忽略。第一种方法帮助我实现了我想要的。最初,当我使用promise.delay时,我将其用作promise.delay(5000)。然后(()=>doSmth());
而不是promise.delay(5000,doSmth())
。