使用node.js时,我希望以http.get
每次仅运行10个(或n个)的方式访问多个远程URL。
如果本地发生异常(m次),我也想重试一个请求,但是当状态代码返回错误(5XX,4XX等)时,该请求将视为有效。
这对我来说真的很难缠住我的头。
问题:
对于每个异步问题,似乎都建议使用Promise,但是最终我嵌套了太多的Promise,很快它就变得无法使用。
有很多方法可以处理一次运行的10个请求。
异步库 -将异步库与.parallelLimit()
方法一起使用,您可以在其中指定要一次运行的请求数。
Bluebird Promise库 -使用 Bluebird Promise 库和该request
库将您的http.get()
东西包装成可以返回 Promise的 东西,然后将Promise.map()
并发选项设置为10
。
手动编码 - 手动编码 您的请求以启动10个请求,然后每次完成一个请求,再启动另一个请求。
在所有情况下,您都必须手动编写一些重试代码,并且与所有重试代码一样,您将必须非常仔细地确定重试错误的类型,重试错误的时间,重试尝试之间的间隔以及何时重试。最终放弃(您未指定的所有内容)。
我首选的方法是使用Bluebird和promises。依次包括重试和结果收集,可能看起来像这样:
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
});
我想用不同的预请求脚本多次运行相同的请求?不使用数据驱动(CSV)测试,我能做什么? 例如,我必须多次运行下面的GET url(每2分钟一次),但每当我运行它时,我都需要进行不同的预请求测试! {{url}}/legacy/COL 在此处输入图像描述
问题内容: 假设有一个函数,应该执行一个HTTP请求并将其用于该请求。 如果在循环中调用if ,我希望下一个请求是在上一个完成之后执行的(串行执行,一个接一个)。为了不使回调和Promises混乱,我想使用async / await模式(与Babel.js一起编译以与Node 6+一起运行)。 但是,我不清楚如何等待响应对象进行进一步处理,以及如何作为以下结果返回它: 如果我使用 mocha 为H
问题内容: 我正在尝试将一小部分数据从索引A复制到索引B。 我有一个在EC2实例上运行的Logstash配置,其中包含Elasticsearch输入,一些过滤器和Elasticsearch输出。 首次运行时,此方法运行良好,但如果将任何新数据添加到索引A(满足输入的查询条件),则Logstash配置不会检测到该数据并将其输出到索引B。 这让我想,Elasticsearch输入是否仅运行一次?与文件
我刚接触Postman,遇到了一个我无法解决的经常性问题。我试图使用在预请求脚本上建立的数据数组多次运行同一个请求,但是,当我转到runner时,请求只运行一次,而不是3次。 预请求脚本: 测试: 我已经查看了文档,但我找不到我的代码有什么问题。 谢谢!
问题内容: 是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,但不确定如何编写cron表达式以使其不定期运行。这一次,每天晚上8点触发。 有什么建议? 问题答案: 您可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多配置(包装了
问题内容: 是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,并且不确定如何编写cron表达式以使其不定期运行。这一次,每天晚上8点触发。 有什么建议么? 问题答案: 你可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多的配置(