如何中止 RequireJS 'require' 请求?

How to abort RequireJS 'require' request?

是否有可能(以及如何)中止 RequireJS require 请求?

我希望能够做这样的事情:

define([
    'Backbone.View'
],
function (BackboneView) {

    var View = BackboneView.extend({

        initialize: function () {

            // store require deferred
            // (I know this is not possible in this way!)
            // Is there a way to capture require deferred?

            this.deferred = require(['someModule'], function () {

                // do something

            });

        },

        close: function () {

            // abort require request if view is closed before request resolves
            this.deferred.abort();

            this.remove()

        }

    });

    return View;

});

因此,如果 Backbone 视图在 require 请求解决之前关闭,我希望能够中止 require 请求。

我查看了 RequireJS 文档及其 GitHub 页面。 没有描述如何处理这个。

欢迎任何帮助:) 发送

你的问题有点奇怪,因为你只会部署一个最小化的文件,而且几乎没有延迟。

对于科学来说,require 只是将脚本元素添加到 DOM 中,并具有某些比例,例如 data-requiremodule=[MODULE_NAME] 所以你基本上可以做这样的事情:

function abortModuleLoad(moduleName)
    var scripts = document.getElementsByTagName('script');
    for(var i = 0 ; i < scripts.length ; i++){
        if(scripts[i].dataset.requiremodule === moduleName) document.head.removeChild(scripts[i])
    }
}

close: function () {

    // abort require request if view is closed before request resolves
    abortModuleLoad("someModule");

    this.remove()

}

RequireJS 不提供取消 require 调用的方法。

我想理论上可以实现它,但它会使 RequireJS 的内部复杂化很多,以获得相当罕见的好处。假设你需要foo,考虑:

  1. 您的代码实际上多久会处于需要取消require调用的位置?您的视图必须快速连续初始化和关闭。

  2. 如果 foo 在发出 require 调用之前已经获取并初始化 只有 作业 require必须做的是 return 已经存在的对 foo 的引用。所以基本上没有什么可以取消的。请注意,如果在您的应用程序中曾经允许视图完全初始化 一次 ,则这里考虑的场景适用。

  3. 如果 RequireJS 足够快,可以在取消之前完成 require 调用,那么取消没有任何效果。一旦应用程序被优化,RequireJS 很可能会在可以取消之前完成调用。在优化的应用程序中,运行 require 的代码与所需代码位于同一包中,因此 RequireJS 无需从网络中获取任何内容来满足 require 调用。

所以在很多情况下,取消是没有效果的,但是对于 RequireJS 可能不得不取消某些东西的情况,它必须密切关注谁在要求什么。在您看来,您的 require 调用可能是唯一需要 foo 的调用,但 foo 也可能需要 barbaz。如果 foo 是唯一需要它们的,那么如果你取消 require 调用,那么 RequireJS 可以取消获取和初始化 foobarbaz 但是总是有可能 after 发布了 requirebefore 它完成了 another 部分您的应用程序需要 baz。所以现在 RequireJS 必须记住取消 foobar 是可以的,但是 不是 baz 因为它在其他地方是必需的。