Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js中请求信息时延迟承诺请求_Javascript_Node.js_Promise_Google Play_Request Promise - Fatal编程技术网

Javascript 在Node.js中请求信息时延迟承诺请求

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

我使用该库查找Play Store,并存储有关Play Store上找到的应用程序的信息。我首先查找一个应用程序的相关应用程序(大约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});
    });
}
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());
    });
}
注:

  • 可从Node.js 7.0.0获得。对于节点的早期版本,请恢复到问题中的building
    relatedArray
  • 假设问题的
    relatedArray
    最初为空
  • 根据需要调整1000毫秒延迟

  • 尝试类似->
    返回承诺。延迟(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())