Javascript 如何中止RequireJS';要求';要求
是否可能(以及如何)中止RequireJSJavascript 如何中止RequireJS';要求';要求,javascript,backbone.js,requirejs,deferred,Javascript,Backbone.js,Requirejs,Deferred,是否可能(以及如何)中止RequireJSrequire请求 我希望能够做到以下几点: define([ 'Backbone.View' ], function (BackboneView) { var View = BackboneView.extend({ initialize: function () { // store require deferred // (I know this is not p
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;
});
因此,如果主干视图在require
请求解决之前关闭,我希望能够中止require
请求
我已经查看了RequireJS文档和他们的GitHub页面。
没有描述如何处理这个问题
欢迎任何帮助:)
Tnx您的问题有点奇怪,因为您将只部署一个最小化的文件,而且几乎不会有延迟 请注意,require只需按一定比例向DOM添加一个脚本元素,如
datarequiremodule=[MODULE\u 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()
}
函数abortModuleLoad(moduleName)
var scripts=document.getElementsByTagName('script');
对于(var i=0;i
RequireJS不提供取消require
调用的方法
我认为从理论上讲,实现它是可能的,但它会使RequireJS的内部功能复杂化很多,从而获得相当少的好处。假设您需要foo
,请考虑:
require
调用的位置的频率是多少?您的视图必须连续快速初始化和关闭require
调用之前已提取并初始化foo
,则require
所要做的唯一工作就是返回对foo
的现有引用。所以基本上没有什么可以取消的。请注意,如果允许视图在应用程序中完全初始化一次,则此处考虑的场景适用require
调用,那么取消就没有效果。一旦应用程序得到优化,RequireJS很可能会在取消之前完成调用。在优化的应用程序中,运行require
的代码与所需的代码位于同一捆绑包中,因此RequireJS不必从网络获取任何东西来满足require
调用因此,在许多情况下,取消将是无效的,但对于RequireJS可能不得不取消某些内容的情况,它必须对谁需要什么进行详细的说明。可能视图中的
require
调用是唯一需要foo
的调用,但是foo
也可能需要bar
和baz
。如果foo
是唯一需要它们的,那么如果取消require
调用,那么RequireJS可以取消获取和初始化foo
,bar
和baz
但是在发布require
之后,但在它完成应用程序的另一部分之前,总是有可能需要baz
。所以现在RequireJS必须记住,可以取消foo
和bar
,但是不能取消baz
,因为它是在其他地方需要的。您测试过吗?你知道删除RequireJS添加的脚本
元素实际上不会导致RequireJS进入不一致的状态吗?嗨,raam86,谢谢你的回答。问题是我不想运行r.js。所以脚本不会缩小到一个文件。某些文件在某些情况下应该加载。另外,在头文件中创建脚本标记之前,应该动态加载脚本源。如果视图关闭且请求尚未解决,我想中止此操作。非常感谢您的回答。我必须承认我不是那样看的,但你是对的。您建议对所有模块和文件运行优化(r.js),还是只对部分模块和文件运行优化(r.js),让其他模块和文件动态加载?不客气。是将所有内容捆绑在一个文件中还是拥有多个捆绑包实际上取决于应用程序的详细信息。在很多情况下,将所有内容捆绑到一个文件中是一种方法。但是,如果您有一个带有可选插件的应用程序,那么没有充分的理由将所有内容捆绑在一起,特别是如果插件是大量的。在这种情况下,一个核心包加上每个插件一个包就是最好的选择。