Node JS,链接可变数量的http请求
Node JS, chaining variable number of http requests
我使用request js
库向我的API发出HTTP请求。我的单个API调用看起来像这样:
var options = {
method: "post",
url: 'http//example.com',
json: true,
headers: headers,
body: {key: value}
}
request(options, callback);
然而,我有options
数组,需要一个接一个地调用,如果其中一个失败,我需要打破整个链。
如果最后一个链完成,我需要输出结果到控制台。
我知道链接回调可以通过承诺实现,但我发现的所有示例都使用预定义的链接请求数量。
有可能吗?
在请求回调中调用自己的递归函数应该可以工作。
options = [{...}, {...}];
function doRequests(options){
request(options.shift(), function(){
if(error){
return "handle error";
}
if(options.length > 0){
doRequests(options);
}
});
}
我要做的第一件事是使用返回承诺的请求库。假设你有这样的东西,那么你只需将承诺链接在一起。
首先创建一个已解析的承诺:
var promise = new Promise.resolve();
要请求的每个新对象:
promise = promise.then(() => requestToPromise(options));
将把另一个请求链接到现有的承诺上,并且只有在前一个请求完成时才会触发一个新的请求。
如果您有一个数组,您可以拥有该数组的索引,并在前一个请求完成时让回调启动下一个请求。约:
var index = 0;
var options = [/*...array of options objects...*/];
doRequest() {
request(options[index], function(err, result) {
// ...handle the result/error here. If there's no error, then:
if (++index < options.length) {
// Kick off the next request
doRequest();
}
});
}
虽然上面的可以被承诺,因为你的request
方法似乎不是,它只会使事情复杂化。
你可以使用request-promise
并执行以下操作
import request = require('request-promise');
var options = [/*...array of options objects...*/];
requests = [];
options.forEach(function(option){
requests.push(request(option));
}
Promise.all(requests).then(function(reponses){
//all requests are done.
});
相关文章:
- Meteor如何接收HTTP请求
- 在我的情况下,如何进行http请求
- 使用插件收听Firefox标签的http请求
- http请求使用html而不是json进行响应
- 在node-js路由中发出http请求
- 是否可以在没有HTTP请求或<输入>
- Acync JS HTTP请求通知请求
- PhantomJs在控制台中发出http请求时不会返回任何状态
- PHP处理来自一个页面的http请求,并将其显示在另一个页面上
- Firefox插件-如何发出http请求
- 验收测试主要针对传出的http请求
- 验证HTTP请求来自NFC标签上的点击
- 如何制作'http请求'在Node js中同步
- 为什么我在Cloud9中的http请求总是返回错误
- AngularJS Typeahead和$http请求限制
- HTTP请求使用cURL,但在浏览器中使用javascript时会得到CORS响应
- 如何使用Chrome扩展API获取网页的所有HTTP请求
- 将http请求中的数据传递给C#控制器
- 在初始化路由之前发送$http请求
- 从客户端捕获 HTTP 请求(包括 ajax)