首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qiutian00
V2EX  ›  问与答

请教一个问题: js 定时器清除

  •  
  •   qiutian00 · 150 天前 · 619 次点击
    这是一个创建于 150 天前的主题,其中的信息可能已经有所发展或是发生改变。
    清除 js 定时器的时候,可能这个定时器的执行函数正在被执行,产生了一些界面的效果(如画了一个人的实时运动轨迹路线),界面显示可能就有残留; 这个有办法解决么?
    9 条回复    2020-03-18 22:53:51 +08:00
    AcoStory
        1
    AcoStory   150 天前
    把代码贴出来,本大神给你看看
    qiutian00
        2
    qiutian00   150 天前
    @AcoStory 代码就不贴了,在公司遇到的问题
    erguotou521
        3
    erguotou521   150 天前 via Android
    等定时器里的逻辑跑完再清啊
    rabbbit
        4
    rabbbit   150 天前
    let stop;
    function loop(mi) {
    ...if (stop) {
    ......return;
    ...}
    ...// do ...
    ...setTimeout(() => {
    ......loop();
    ...}, mi);
    }
    loop(mi);

    // 停止循环
    stop = true;
    qiutian00
        5
    qiutian00   150 天前
    @erguotou521 ,很多个定时器哦
    qiutian00
        6
    qiutian00   150 天前
    @rabbbit , 会不会在执行 do 部分内容时( do 部分内容很复杂,执行时间较长),点击某个操作,想显示其他内容:可能 do 执行的残留还是显示在界面
    rabbbit
        7
    rabbbit   150 天前   ❤️ 1
    @qiutian00
    这个得自己控制内部流程,在所有有必要的地方判断是否要停止.
    要是觉得写一堆 if(stop) 太难看,也可以用生成器.

    function* process() {
    ...console.log("流程 1");
    ...yield;
    ...console.log("流程 2");
    ...yield;
    ...console.log("流程 3");
    ...yield;
    }

    let stop;
    function run() {
    ...const iterator = process();
    ...for (let i of iterator) {
    ...if (stop) return;
    ...}
    }

    run();
    rabbbit
        8
    rabbbit   150 天前
    也可以用生成器. -> 也可以用生成器控制流程
    qiutian00
        9
    qiutian00   150 天前
    @rabbbit 好的好的,感谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1165 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:06 · PVG 03:06 · LAX 12:06 · JFK 15:06
    ♥ Do have faith in what you're doing.