Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 运行1000个请求,以便一次只运行10个_Javascript_Node.js_Asynchronous_Promise - Fatal编程技术网

Javascript 运行1000个请求,以便一次只运行10个

Javascript 运行1000个请求,以便一次只运行10个,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,使用node.js,我想http。以一种一次只能运行10个(或n个)的方式获取大量远程URL 如果本地发生异常(m次),我还希望重试请求,但当状态代码返回错误(5XX、4XX等)时,请求将被视为有效 这对我来说真的很难理解 问题: 无法尝试捕获http.get,因为它是异步的 需要一种在请求失败时重试请求的方法 我需要某种跟踪当前活动请求计数的信号量 当所有请求完成后,我想在一个列表中获得所有请求URL和响应状态代码的列表,我想对其进行排序/分组/操作,因此我需要等待所有请求完成 似乎对于每个异

使用node.js,我想
http。以一种一次只能运行10个(或n个)的方式获取大量远程URL

如果本地发生异常(m次),我还希望重试请求,但当状态代码返回错误(5XX、4XX等)时,请求将被视为有效

这对我来说真的很难理解

问题:

  • 无法尝试捕获http.get,因为它是异步的
  • 需要一种在请求失败时重试请求的方法
  • 我需要某种跟踪当前活动请求计数的信号量
  • 当所有请求完成后,我想在一个列表中获得所有请求URL和响应状态代码的列表,我想对其进行排序/分组/操作,因此我需要等待所有请求完成

  • 似乎对于每个异步问题都建议使用承诺,但我最后嵌套了太多的承诺,很快就变得无法理解了。

    简单的方法是使用库,它有一种方法可以完全满足您的需要。

    有很多方法可以处理一次运行的10个请求

  • 异步库-将异步库与一起使用,您可以在其中指定一次要运行的请求数

  • 蓝鸟承诺库-使用和
    请求
    库将您的
    http.get()
    包装成可以返回承诺的内容,然后使用
    Promise.map()
    ,并发选项设置为
    10

  • 手动编码-手动编码您的请求以启动10个,然后每次一个请求完成后,启动另一个请求

  • 在所有情况下,您都必须手动编写一些重试代码,并且与所有重试代码一样,您必须非常仔细地决定您重试的错误类型、重试时间、重试间隔以及最终放弃的时间(所有您未指定的事项)

    其他有关答案:


    我喜欢的方法是蓝鸟和承诺。按顺序包括重试和结果收集,可能如下所示:

    const request = require('request');
    const Promise = require('bluebird');
    const get = Promise.promisify(request.get);
    
    let remoteUrls = [...];    // large array of URLs
    
    const maxRetryCnt = 3;
    const retryDelay = 500;
    
    Promise.map(remoteUrls, function(url) {
        let retryCnt = 0;
        function run() {
            return get(url).then(function(result) {
                // do whatever you want with the result here
                return result;
            }).catch(function(err) {
                // decide what your retry strategy is here
                // catch all errors here so other URLs continue to execute
                if (err is of retry type && retryCnt < maxRetryCnt) {
                    ++retryCnt;
                    // try again after a short delay
                    // chain onto previous promise so Promise.map() is still
                    // respecting our concurrency value
                    return Promise.delay(retryDelay).then(run);
                }
                // make value be null if no retries succeeded
                return null;
            });
        }
        return run();
    }, {concurrency: 10}).then(function(allResults) {
         // everything done here and allResults contains results with null for err URLs
    });
    
    const request=require('request');
    const Promise=require(‘蓝鸟’);
    const get=Promise.promisify(request.get);
    让RemoteURL=[…];//大量URL
    常数maxRetryCnt=3;
    常数retryDelay=500;
    Promise.map(远程url,函数(url){
    设retryCnt=0;
    函数运行(){
    返回get(url).then(函数(结果){
    //你想怎么做就怎么做,结果就在这里
    返回结果;
    }).catch(函数(err){
    //确定您的重试策略是什么
    //在此处捕获所有错误,以便其他URL继续执行
    if(err为重试类型&&retryCnt
    如果嵌套的承诺太多,请更频繁地从“then”调用返回,并在同一缩进级别上编写下一个“then”。可能重复的
    可能重复。parallelLimit
    不提供重试的方法,因此无法提供OP要求的所有内容。还需要添加更多内容。