😀Promise并发控制

当需要查询1000w个url的时候,想多线程发送,但是不想同时一次性查询。

🕒 一次性查询

var http = require("http");
 
var totalUrl = 10000000;
for( var i = 0; i < totalUrl; i++ ) {
    getUrl(i);
}
 
 
function getUrl(idToFetch){
 
    var options = {
      host: 'www.mywebsite.com',
      port: 80,
      path: '/page.php?id='+idToFetch,
      agent: false,
      pageId: idToFetch
    };
 
    http.get(options, function(res) {
        var pageData = "";
 
        res.resume();
        res.on('data', function (chunk) {
            if(res.statusCode == 200){
                pageData +=chunk;
            }
        });
 
        res.on('end', function() {
            console.log("finish to fetch id: "+options.pageId);
            // do something with the HTML page
        });
 
    }).on('error', function(e) {
       console.log("Error: " + options.host + "\n" + e.message);
    });
}

🚀控制promise并发

Promise.race可以接收一个promise数组并,在其中第一个promise返回的时候返回。通过这个我们就可以控制并发的promise数量。

/**
 * promise 并发处理 控制最大请求数
 * @param factory promise工厂 返回非Promise对象表示结束
 * @param maxRun  最大并发数
 * @param promises promise数组 缓存正在运行的promise
 * @param startIndex 开始的索引 默认从0 开始
 * @returns {Promise}
 */
function promiseMax(factory, maxRun, promises, startIndex) {
    if (!Array.isArray(promises)) {
        promises = [];
    }
    if (startIndex === undefined) {
        startIndex = 0;
    }
    while (promises.length < maxRun) {
        let pro = factory(startIndex++);
        if (pro instanceof Promise) {
            pro = pro.then(v => {
                promises.splice(promises.indexOf(pro), 1);
                return v;
            });
            promises.push(pro);
        } else {
            return Promise.all(promises);
        }
    }
    return Promise.race(promises).then(() => {
        return promiseMax(factory, maxRun, promises, startIndex)
    });
}

✈️并发请求

通过promiseMax第二个参数可以很容易控制并发数量。

promiseMax((idToFetch) => {
    if (idToFetch >= 10000000) return false;
    return new Promise((resolve, reject) => {
        var options = {
            host: 'www.mywebsite.com',
            port: 80,
            path: '/page.php?id=' + idToFetch,
            agent: false,
            pageId: idToFetch
        };

        http.get(options, function (res) {
            var pageData = "";

            res.resume();
            res.on('data', function (chunk) {
                if (res.statusCode == 200) {
                    pageData += chunk;
                }
            });

            res.on('end', function () {
                console.log("finish to fetch id: " + options.pageId);
                resolve();
            });

        }).on('error', function (e) {
            console.log("Error: " + options.host + "\n" + e.message);
            reject(e);
        });
    });
}, 10).then(() => {
    console.info('end');
});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 8,696评论 0 29
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,881评论 18 139
  • 其实我们每个人的大脑就相当于一个属于自己的操作系统,有各自输入与输出的体系,有一套自己对事物的运行处理机制。而不同...
    洪雅昕阅读 218评论 0 0