我需要在每个 axios POST 调用之间放置一些延迟,以便 POST 调用按顺序排列 - 等待一个完成,然后再发出下一个 POST。
我输入的延迟代码似乎延迟 - 控制台日志显示"延迟"并在那里暂停几秒钟,但在服务器端,POST 调用仍然是并发的。
import * as Axios from "axios";
delay(delayTime:number) {
var tNow = Date.now();
var dateDiff = 0;
do {
dateDiff = Date.now() - tNow;
} while (dateDiff < delayTime); //milliseconds
}
// the code below is in a for loop
let axiosConfig = {
url: myurl,
method: ‘POST’,
timeout: 5,
headers: {
'Authorization' : AuthStr,
'Accept' : 'application/json',
'Content-Type' : 'application/json'
},
data: objContent
}
console.log(">>>>>>>>>>>>>>>>>>> Delaying”);
delay(10000);
let request = Axios.create().request(axiosConfig).
catch((rejection:any) => {
// some code
});
为了等待一个 HTTP 请求完成,然后再发出下一个请求,您需要对 HTTP 请求进行排队(队列异步操作(。步骤如下:
- 当需要 HTTP 请求时,将其添加到队列中。
- 检查队列中是否有任何元素。如果有的话,拿起一个并执行它。
- 完成该 HTTP 请求后,转到步骤 2。
示例代码如下所示:
const axios = require('axios');
let queue = [];
function sendRequest(callback) {
axios.get('http://example.com')
.then(function() {
callback();
}).catch(function () {
callback();
});
}
function addRequestToQueue() {
let id = (Math.random()*100000).toFixed(0);
if (queue.length === 0) {
sendRequest(function() {
queue.splice(queue.indexOf(id), 1);
consumeQueue();
});
}
queue.push(id);
}
function consumeQueue() {
if (!queue.length) {
return;
}
let id = queue[0];
sendRequest(function() {
queue.splice(queue.indexOf(id), 1);
consumeQueue();
});
}
addRequestToQueue();
addRequestToQueue();
addRequestToQueue();
addRequestToQueue();
addRequestToQueue();