求助,取消定时器失败,定时器仍然运行

大家好,我想实现的功能是弹出一个对话框,对话框中的文字是一个一个显示出来的。
如果玩家在文字没有显示完的时候点击了屏幕,那么就直接显示全部字母,然后等待玩家的下一次 点击,玩家再次点击的时候隐藏界面。如果玩家在文字显示完了以后再点击屏幕就直接隐藏界面。
现在遇到的问题是this.unschedule函数不能停止我之前开启的计时器函数,现在点击以后会出现所有的lable然后还会一个一个的出现文字。但是如果我用this.unscheduleAllCallbacks()这个方法就能实现功能,因为有可能会加一些其他的计时器,所以我不想用unscheduleAllCallbacks()这个 方法,源码如下:

    //显示lable界面
    _displayLable(lableString){
        this.FailLable.opacity=255;
        this.FailLable.children[1].setPosition(0,-this._height/2+160);
        this.FailLable.children[1].getComponent(cc.Label).string="";
        this.schedule(this._failLableSchedule.bind(this,lableString),0.06,lableString.length-1);

        this.FailLable.once(cc.Node.EventType.TOUCH_END,this._displayAllLable.bind(this,lableString),this);
    },
    //显示全部lable
    _displayAllLable(lab){
        //如果点击的时候lable没有显示完,就关闭计时器,直接让lable显示完
        if(this.FailLable.children[1].getComponent(cc.Label).string.length!==lab.length){
            //this.unscheduleAllCallbacks();
            //停止计时器没用
            this.unschedule(this._failLableSchedule);
            this.FailLable.children[1].getComponent(cc.Label).string=lab;
            this.FailLable.once(cc.Node.EventType.TOUCH_END,this._hideLable,this);
        }
        //如果lable显示完了就直接隐藏界面
        else{
            this._hideLable();
        }
    },
    //隐藏界面
    _hideLable(){
        this.FailLable.opacity=0;
        this._LableNum=0;
    },
    //计时器函数
    _failLableSchedule(lab){
        this.FailLable.children[1].getComponent(cc.Label).string+=lab[this._LableNum];
        this._LableNum++;
    },

this.unschedule(this._failLableSchedule.bind(this,lableString));

试试
或者干脆不要用bind
N久之前也遇到过这个问题。

这个我试过了还是不行,bind传参传的是lab,因为lableString是上一个函数中的参数,会找不到。不用bind的话应该用什么传参?

你好这个问题原因是this.unschedule(callback, target)是需要两个参数来指定需要暂停的定时器对象。
callBack 必须是与this.schedule中的回调一样,匿名函数不行。
target则是schedule的环境对象,这两个如有差异都不能正常停止schedule。
实现可以参考:
CCScheduler.js -> unschedule

mark

用原生的settimeout 和 setinterval 不够你用吗?

那为啥我找到的只要传一个参数

新手,文档说计时器更灵活我就用计时器了,用settimeout和setinterval的理由是什么,效率更高吗?

我将lablestring这个变量变成this._lableString,然后将计时器的callback函数变成无参的就弄好了,但是我想问一下
1、我用bind传递参数是不是因为参数的作用域不同所以才不能停止前面定义的计时器,之前我我传参的都是都已经bind(this)了
2、计时器不能带参数吗?

你这个返回的是一个新的函数对象,可以用一个变量保存函数对象,然后在unschedule传入该变量

感谢回复,大概明白了,有时间我试验一下,谢谢

1赞