function windowResize() {
someFunction();
console.log("test3");
}
function someFunction(){
console.log("test");
longExecutingFunctionWithAsyncReq();
console.log("test2");
}
function longExecutingFunctionWithAsyncReq() {
// some codes here
}
每当调整窗口大小(缩小/缩小(时,都会调用此函数。但是,如果用户向缩放发送垃圾邮件,someFunction()
将没有时间完成,然后会导致错误。
我正在考虑通过停止当前操作然后处理新操作来解决此问题。另外,我尝试阅读有关延期和承诺的信息,但我无法理解该主题的简单性,我不确定它是否真的解决了我的问题。另外,我还检查了回调,并且非常怀疑这也不能解决我的问题。
如果我的解决方案不可行,我想到只是排队操作,但缺点可能是,如果不加以控制,队列可能会溢出。至于这个解决方案,除了阅读它之外,我没有进一步研究这个问题。
您可以使用timeout
并在调用 resize 函数时重置它之前将其清除:
var myTimeout;
function windowResize() {
clearTimeout(myTimeout);
myTimeout = setTimeout(someFunction, 500);
}
这样,当用户停止调整大小并且经过 500 毫秒后,将调用该函数。
如果你只需要等待操作完成,你可以设置一个标志。
var working = false;
function windowResize() {
if (!working){
working = true;
someFunction();
console.log("test3");
}
}
function someFunction(){
console.log("test");
longExecutingFunctionWithAsyncReq();
console.log("test2");
}
function longExecutingFunctionWithAsyncReq() {
// some codes here
// on finish set working to False
}
var isStillWorking = false;
function windowResize() {
if(isStillWorking) {
// Do nothing.
} else {
someFunction(function(){
isStillWorking = false;
});
console.log("test3");
}
}
function someFunction(callback){
isStillWorking = true;
console.log("test");
longExecutingFunctionWithAsyncReq();
console.log("test2");
}
function longExecutingFunctionWithAsyncReq() {
// some codes here
}
为了澄清更多 Anton 的答案,我设法使用标志 [global] 变量和回调来实现同样的事情。我使用回调来flag=false
,因为我还需要等待函数内的异步请求完成,然后再重置标志。