【问题标题】:Javascript pattern for callback timeout with setTimeout?使用 setTimeout 进行回调超时的 Javascript 模式?
【发布时间】:2018-03-27 18:57:21
【问题描述】:

在页面加载时,我设置了一些函数并调用第一个应该逐步完成的函数。

after5Seconds();

function after5Seconds() {
  setTimeout(hideOne, 5000);
}
function hideOne() {
  $('.toggleme#one').fadeOut(showTwo);
}
function showTwo() {
  $('.toggleme#two').fadeIn('125', 'swing', startAllOver); 
}

我发现经常有一些回调被停止并默默地失败,我开始将每个回调更新为更像:

  • setTimeout 在 N 毫秒内触发回调(如果尚未触发)

类似:

  function wrapMeInDelay(fn, timer) {
    var hasBeenCalled = false;
    var ctx = function() {
      if (hasBeenCalled) {
        return false;
      } else {
        hasBeenCalled = true;
        return fn();
      }
    };
    setTimeout(ctx, timer);
    return ctx;
  }

基本上我想开始向回调添加超时,以确保在 jquery/whatever 回调没有首先触发它时调用它们。

还有其他我不知道的更常见的方法吗?

【问题讨论】:

  • 我想您可能正在寻找.queue?或者,由于它涉及多个元素,因此可以利用 .when() and .done() 进行结帐。
  • 我认为你错过了我的观点。有时,出于某种原因,打算调用回调的对象失败。我想添加各种超时,以便回调由超时或调用者触发
  • 好的,我明白了,我的错误。因此,如果它静默失败,您将无法利用诸如.fail() 之类的延迟错误处理程序之一,对吗?你有没有探索过为什么它会默默地失败?解决这可能更像是根本原因解决方案,因为您使用的模式更多地治疗症状。并不是说这是不正确的,因为我不了解您所面临问题的全部背景——我只是在推测。

标签: javascript callback


【解决方案1】:

如果我理解正确,你想在 X 秒后调用某个函数,前提是该函数尚未被调用?

var _timeout;
function onTrigger(){
  if (_timeout){
    clearTimeout(_timeout);
  };
  console.log("function triggered");
};
_timeout = setTimeout(onTrigger, 5000);
onTrigger();

您需要存储对该超时的变量引用,并在调用函数时删除该超时(clearTimeout)。在这种情况下将不会执行超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2022-11-22
    • 2022-01-03
    • 2016-11-15
    • 1970-01-01
    • 2010-10-22
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多