我正在尝试进行API调用,但我希望它每2秒重复一次。但是我担心,如果系统在2秒内没有收到请求,它将建立请求并继续尝试发送。我该如何预防?
这是我尝试fetch
的操作:
const getMachineAction = async () => {
try {
const response = await fetch( 'https://localhost:55620/api/machine/');
if (response.status === 200) {
console.log("Machine successfully found.");
const myJson = await response.json(); //extract JSON from the http response
console.log(myJson);
} else {
console.log("not a 200");
}
} catch (err) {
// catches errors both in fetch and response.json
console.log(err);
}
};
然后我用
setInterval
来称呼它。function ping() {
setInterval(
getMachineAction(),
2000
);
}
我已经考虑过在setInterval中做一些像结构这样的 promise ,以确保提取工作已经完成,但无法正常进行。
最佳答案
此解决方案可确保您不会错过2秒的延迟要求,并且在正在进行另一个网络 call 时也不会触发 call 。
function callme(){
//This promise will resolve when the network call succeeds
//Feel free to make a REST fetch using promises and assign it to networkPromise
var networkPromise = fetch('https://jsonplaceholder.typicode.com/todos/1');
//This promise will resolve when 2 seconds have passed
var timeOutPromise = new Promise(function(resolve, reject) {
// 2 Second delay
setTimeout(resolve, 2000, 'Timeout Done');
});
Promise.all(
[networkPromise, timeOutPromise]).then(function(values) {
console.log("Atleast 2 secs + TTL (Network/server)");
//Repeat
callme();
});
}
callme();
注意:这照顾到了问题作者所要求的错误案例定义:
“最糟糕的情况”(即,需要花费超过2秒的时间)是我希望它跳过该请求,然后发送一个新的请求。因此,在0秒时,请求发送。执行需要3秒,然后需要2秒稍后(在5点)应该重新执行。因此它只是延长了发送时间。”
关于javascript - 每2秒提取一次调用,但不希望请求堆积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55522330/