javascript - 多次调用函数中的 setTimeout

标签 javascript settimeout

我有一个函数,用于在进程运行时向 div 添加状态指示器,并在该进程完成时将其删除。我遇到的问题是当多个函数正在处理并完成时,working_handle 仅删除第一个进程的工作状态。

如果我删除代码的 setTimeout 部分,它可以正常工作,但是我想要延迟它,因为它发生得太快,有点刺耳。

function working_handle(id, state) {

 idh = id.replace(/^#/, '');

  if (state === true) {
    console.log('WORKING'+'-'+idh);
    $(id).removeClass('error').addClass('working');
    $('#status').removeClass(idh+'-error').addClass(idh+'-working');
  } else {
    console.log('DONE'+'-'+idh);
    setTimeout(function() {
      $(id).removeClass('working');
      $('#status').removeClass(idh+'-working');
    }, 2000);
  }

}

最佳答案

idh 之前没有 var(或 constlet),这使其成为 implicit global 。这意味着对函数的每次调用都共享相同的闭包变量并覆盖其值。

要解决该问题,请对其进行声明,以便将其范围限定在函数内:

var idh = id.replace(/^#/, '');

我还建议将 "use strict" pragma 添加到 JS 文件的顶部,这将有助于捕获此类问题。隐式全局变量是个坏消息。

关于javascript - 多次调用函数中的 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50046956/

相关文章:

javascript - CasperJS/Javascript 选择多个选项

javascript - 如何让clearTimeout()在setTimeout()中发生?

带有 settimeout 函数的 javascript 闭包

javascript - JS用动画改变源图像

javascript - 如何在用户将鼠标悬停在元素上 x 秒后触发功能?

javascript - 通过具有对话 ID 的 Restify API 访问特定聊天

javascript - appendChild 不会将节点添加到子级列表的末尾

javascript - 如何设置ajax超时?

javascript - Protractor :如何等待引导的 AngularJS 完全加载

javascript - onclick window.open 和警报