Javascript 运行1000个请求,以便一次只运行10个
使用node.js,我想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和响应状态代码的列表,我想对其进行排序/分组/操作,因此我需要等待所有请求完成 似乎对于每个异
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要求的所有内容。还需要添加更多内容。