我正在使用request js
库向我的API发出HTTP请求。我的单个API调用如下所示:
var options = {
method: "post",
url: 'http//example.com',
json: true,
headers: headers,
body: {key: value}
}
request(options, callback);
但是,我有options
数组,需要一个接一个地称为 ,如果其中一个失败,我需要打破整个链。
如果最后一个链完成,我需要将结果输出到控制台。
我知道链接回调可以通过promises实现,但我找到的所有示例都使用了预定义的链式请求。
有可能吗?
答案 0 :(得分:2)
在请求回调中调用自身的递归函数应该可以工作。
options = [{...}, {...}];
function doRequests(options){
request(options.shift(), function(){
if(error){
return "handle error";
}
if(options.length > 0){
doRequests(options);
}
});
}
答案 1 :(得分:2)
我要做的第一件事就是使用一个返回promise的请求库。假设你有这样的事情,那么你只需将承诺链接在一起。
首先创建一个已解决的承诺:
var promise = new Promise.resolve();
您要请求的每个新对象:
promise = promise.then(() => requestToPromise(options));
会将另一个请求链接到现有的承诺上,并且只有在前一个请求完成后才会触发新请求。
答案 2 :(得分:1)
如果你有一个数组,你可以拥有该数组的索引,并在上一个请求完成时让回调启动。大致是:
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
方法似乎不是,它只会让事情变得复杂。
答案 3 :(得分:0)
您可以使用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.
});