我想要实现的是同步执行HTTP请求的有序序列,但是根据某些变量的值,我希望其中一些变量被绕过。
作为一个例子(我正在使用Javascript中的request
库这样做):
request(httpReq1, function(error, response, body) {
// do something, like handling errors...
request(httpReq2, function(error, response, body) {
// do something else
});
});
因此,这确保了httpReq2
将在httpReq1
之后执行。
例如,如果某些标志设置为false,我不确定是如何绕过第一个请求,而不是执行httpReq1
并等待响应,而是跳到{{ 1}},保持订单:
httpReq2
什么是解决此问题的好方法?
答案 0 :(得分:2)
排序数组中所需的请求列表,然后使用async/await
let requests = [];
if (doRequest1)
requests.push(httpReq1);
if (doRequest2)
requests.push(httpReq2);
/* etc .. for httpReq3 and so on */
// now execute them one by one in sequence
for(let req of requests) {
try {
await request(req);
} catch (err) {
// error handling here
}
}
答案 1 :(得分:1)
您可以使用async-await来实现。
async apiCall(){
try{
if(condition){
const result1 = await request(httpReq1);
}
const result2 = await request(httpReq2);
}
catch(error){
}
}
确保请求模块重新运行Promise。否则,创建一个承诺包装。 axios是一个基于Promise的库。
您必须在包含等待功能的函数之前放置异步
答案 2 :(得分:1)
为什么不使用2个条件?
if (dontMakeHttpReq1) {
request(req1, function(error, response, body) {
yourRequestProcessing2();
});
}
else {
request(req1, function(error, response, body) {
request(req2, function(error, response, body) {
yourRequestProcessing2();
});
yourRequestProcessing1();
});
}
编辑:也许您想将请求调用存储在数组中
//Whether request n should skip
var flags = [
false,
true,
false
];
var requests = [
function(error, response, body) {
//Process your request 1
},
function(error, response, body) {
//Process your request 2
},
function(error, response, body) {
//Process request 3
}
];
for (i = 0; i < requests.length; i++) {
if (flags[i]) {
request(req1, requests[i + 1]);
}
else {
request(req2, request[i]);
}
}