JS对并发和异步的处理

并发的解决

当调用一个方法时,可能存在按钮无数次点击或者其他原因,导致调用的JS方法执行多次,有以下解决思路:

  • 按钮调用JS,当第一次调用时将按钮设为不可用,执行完成后再释放
  • 设置一个全局变量来控制
<button onclick="myFunction()">测试</button>
<script>
var IsShow=true;
function myFunction(){
    if(this.IsShow){
        this.IsShow=false;
        //do something
        this.IsShow=true;
    }
}
</script>
  • 利用setTimeout来控制,每隔1秒执行函数,在方法执行时先判断timeout,如果执行完调用clearTimeout() 方法取消由 setTimeout() 方法设置的timeout
<button onclick="myFunction()">测试</button>
<script>
var timeId;
function myFunction(){
   if(timeId){
       clearTimeout(timeId);
   }
   timeId=setTimeout(() => {
       //do something
   }, 1000);
}
</script>

但是如果是外部JS文件,我们无法设置全局变量时,可以将函数本身看做对象,附加属性

<button onclick="myFunction()">测试</button>
<script>
function myFunction(){
    if(myFunction.timeId){
        clearTimeout(myFunction.timeId);
    }
    myFunction.timeId=setTimeout(() => {
        //do something
    }, 1000);
}
</script>

异步的解决方法

在JS处理时经常遇到这种情况:两个方法都对某个字段或对象操作,这时候需要等待第一个执行完才可以执行第二个方法,有以下思路可以解决:

  • 并行改为串行
  • AJAX调用接口改为同步方法
  • 回调
async2();
function async1(){
    //do something
}
function async2(){
    //do something
    async1();
}
  • 回调计数
var count = 0;
function async1(){
    //do sth...
    callback();
}
function async2(){
    //do sth...
    callback();
}
function callback(){
    count++;
    if(2==count) 
        console.log('执行结束);
}
  • 循环阻塞
var count= 0;
function async1(){
    //do sth...
    count++;
}
function async2(){
    //do sth...
    count++;
}
while(count>=2){
    console.log("执行结束")
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容