Loading

Cocos Creator schedule计时器使用

代码顺序问题

计时器可以理解为一个纯内部循环的函数,不影响后面代码的运行

    inSys(){
        if(!this.isRunning){//判断计时器是否running running则不执行
                this.isRunning = true; //执行后第一时间切换为running状态
                if(this.State){ 
                cc.log(this.State);
                this.schedule(this.loopbody,1);
                this.isRunning = false;
                }
                else{ 
                cc.log(this.State)
                this.schedule(this.loopbody,1);
                this.isRunning = false;
                }
            }    
    },
    update(dt){
        this.inSys();
    }

如上代码执行后并不会在循环体结束后(内部有跳出函数)才执行切换running。而是单独执行的循环体,然后立即按顺序执行this.isRunning = false,循环体是否执行完毕并不影响其他代码运行。

计时器取消

  • 官方文档:
      this.count = 0;
      this.callback = function () {
       if (this.count === 5) {
           // 在第六次执行回调时取消这个计时器
           this.unschedule(this.callback);
       }
       this.doSomething();
       this.count++;
      }
      component.schedule(this.callback, 1);
    
  • 踩坑使用(无法跳出计时器):
      loopSys(){
          this.callback = function(){
              ...
              this.unschedule(this.callback)
              ...
          }
          this.schedule(this.callback(),1)
      }
    
      update(dt){
          this.loopSys()
      }
    
  • 解决:
      loopBody(){
          ...
          this.unschedule(this.loopBody());
          ...
      }  //计时器内部的循环体 对应上面的callback函数
    
      loopSys(){
          ...
          this.schedule(this.loopBody());
          ...
      }   //计时器调用函数 
      
      update(dt){
          this.loopSys();
      }   //循环调用计时器调用函数
    

原理分析

this.unschedule(callback, target)是需要两个参数来指定需要暂停的定时器对象。callback 必须是与this.schedule中的回调一样,匿名函数不行。target则是schedule的环境对象,这两个如有差异都不能正常停止schedule。

错误使用中的直接调用callback回调函数的时候为匿名函数,返回的是一个新的函数对象,用了一个loopBody来对内部循环函数命名,指定unschedule的传入正确。

posted @ 2021-04-14 22:20  m0r3  阅读(1594)  评论(0编辑  收藏  举报