【问题标题】:How to override setTimeout from outside如何从外部覆盖 setTimeout
【发布时间】:2016-04-06 19:55:09
【问题描述】:

我们在我们的项目中使用require.js,我们需要覆盖setTimeout 在第 1802 行,这是我们需要设置为 0以某种方式完全忽略 setTimeout(我的意思是超过它)的代码,如果我改变了这个问题它在开源代码中明确当我更改版本时代码将丢失,我应该如何从 outside 覆盖这个 setTimout 仅用于 require.js 文件并保留它,只要我使用它lib,是否可以在 JS 中以优雅的方式做到这一点?

/**
 * Execute something after the current tick
 * of the event loop. Override for other envs
 * that have a better solution than setTimeout.
 * @param  {Function} fn function to execute later.
 */
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 4);
} : function (fn) { fn(); };

这是 Git 中 require.js 开源的链接 https://github.com/jrburke/requirejs/blob/master/require.js 第 1802 行

【问题讨论】:

  • 为什么要改成0,而不是4ms?
  • @RowlandShaw - HI Rowland 这就是stackoverflow.com/questions/6032429/…
  • 根据那里的答案,您仍然被限制为每秒打一个电话
  • @RowlandShaw 那么您还有其他更好的想法如何使用 require.js 跳过每秒调用 1 次的问题吗?
  • 这是一个浏览器限制,所以除了不支持在后台使用之外,该浏览器不支持

标签: javascript requirejs prototype


【解决方案1】:

require 对象作为全局变量公开,因此您可以像这样覆盖其方法:

window.require.nextTick = function(fn) {
  setTimeout(fn, 0);
}

但我想不出任何好的理由这样做。


但是,这并不能解决您的问题,因为 setTimeout 调用无论如何都会受到浏览器的限制。更好的选择是简单地调用函数:

window.require.nextTick = function(fn) { fn(); };

您可以在 require 的源代码中看到原始 nextTick 函数可以有两种实现,具体取决于 setTimeout 可用性 - 一种使用 setTimeout,另一种仅在未定义 setTimeout 时使用函数调用(sn-p 你的最后一行粘贴)。这就是为什么我认为像上面那样覆盖这个函数应该不会导致任何问题。

【讨论】:

  • 谢谢 1+,所以我需要在使用 require.js 之前使用它,这将覆盖 nextTick?原因是 stackoverflow.com/questions/6032429/… 假设我想覆盖它我的意思是完全忽略/删除 setTimeout 代码我只需要在没有 setTimeout 的情况下放置您的代码?
  • 是的,我还没有测试过,但它应该可以工作。甚至函数的文档都说它可以被覆盖。但是,您的实现会引入一些不一致,因为函数将不再在“下一个刻度”中执行代码,而是立即执行。
  • 感谢 xersiee,如果我完全删除 setTiemout,您说过以下内容“函数将不再在 'next tick' 中执行代码,而是立即执行”,这会引发哪些问题?
  • 它可能不会导致任何问题,您可以在他们的代码中看到,如果环境不支持setTimeout,他们只是调用提供的函数。除非你的代码以一种奇怪的方式使用这个函数。我的观点只是它很丑,不是很危险:)
  • 谢谢,但你的意思是像下面这样删除 setTimeout 吗? window.require.nextTick = function(fn) { } 还是完全按照您提供的代码执行?最后一个问题:)你写“如果环境不支持setTimeout,他们只是调用提供的函数的代码”,它是哪一行?谢谢!!
猜你喜欢
  • 2021-09-29
  • 2012-10-01
  • 1970-01-01
  • 2022-01-18
  • 2020-03-04
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多