【发布时间】:2016-04-07 19:48:26
【问题描述】:
我们在我们的项目中使用 require.js,我们需要覆盖第 705 行中的 setTimeout,这是我们需要以某种方式忽略/省略的代码setTimeout 根本(我的意思是越过它),如果我在更改版本时在开源代码中显式更改它,代码将会丢失,我应该如何从外部覆盖这个 setTimout 只为 require.js 文件和只要我使用这个库就保留它,是否可以在全球范围内以 优雅 方式在 JS 中做到这一点?
https://github.com/jrburke/requirejs/blob/master/require.js
这是第 705 行
//If still waiting on loads, and the waiting load is something
//other than a plugin resource, or there are still outstanding
//scripts, then just try back later.
if ((!expired || usingPathFallback) && stillLoading) {
//Something is still waiting to load. Wait for it, but only
//if a timeout is not already in effect.
if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
checkLoadedTimeoutId = setTimeout(function () {
checkLoadedTimeoutId = 0;
checkLoaded();
}, 50);
}
}
仅供参考,我们这样做的原因是 Chrome: timeouts/interval suspended in background tabs?
【问题讨论】:
-
这敲响了我所有的警钟,你为什么要这么做?更改全局函数和对象几乎从来没有是个好主意。
-
@MadaraUchiha - 查看我在 setTimout 中提供的链接,当我们在非活动选项卡上使用 require.js 时(我的意思是在打开新窗口后)每次服务加载都需要一秒钟!!!
-
但是,它处于非活动标签中,用户没有观看,你为什么关心它需要多长时间?
-
@MadaraUchiha - 我试着长话短说 :) 我们的逻辑是在非活动选项卡中完成的,当打开新窗口时性能变得很差,你知道我是否可以以某种方式从外部以优雅的方式删除 setTimeout ?谢谢!
-
你会怎么做呢?该设置超时以半递归方式运行,以检查模块是否已加载。如果你只是使用一个普通的循环,你会冻结整个过程,直到所有模块都被加载...
标签: javascript requirejs prototype require