停止当前操作并继续执行另一个(新)操作

Stopping current operation and proceed to another (new) operation

本文关键字:操作 另一个 执行 继续      更新时间:2023-09-26
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,因为我还需要等待函数内的异步请求完成,然后再重置标志。

相关文章: