我一直在尝试Mariotte
使用Require.js
. 最近,我尝试学习如何懒惰地获取文件,即。仅在需要时加载相关.js
文件,而不是在应用程序启动时加载。然而,这被证明是一场噩梦。以下代码片段是我现在尝试做的事情。
define(['app'], function(App) {
App.module('Header', function(Header, App, Backbone, Marionette, $, _) {
this.doSomething = function() { alert('Did something!'); }
this.getSomething = function() { return 'Something'; }
}
});
假设doSomething
需要subdep
先加载它才能完成工作。我可以确保如下:我可以在 ChromeDevtools 中验证仅在调用subdep
时才加载this.doSomething()
。
this.doSomething = function() {
require(['subdep'], _.bind(function() {
alert(this.SubDep.showSomething());
}, this));
}
从这里开始,我有几个问题/疑问希望得到解决。
我需要使用
_.bind()
来保留this
. 这require(...)
也会在视觉上污染代码。有没有办法解决这个问题,也许可以自定义Marionette.Module.prototype
?像这样的东西是理想的:this.doSomething = function() { alert(this.SubDep.showSomething()); } myRequireHash: { 'this.doSomething' : ['subdep'], 'this.getSomething' : ['subdep', 'underscore'] }
假设
this.getSomething
需要向调用者返回一个值。显然,以下内容不起作用,因为该require
语句启动异步加载并立即返回。我该如何解决这个问题?我需要在实际需要时加载依赖项并且还能够返回一个值。this.getSomething = function() { require(['subapp'], _.bind(function() { return this.SubApp.getSomething(); }, this)); }
作为第 2 点的扩展,假设调用者需要在调用
this.doSomething()
之后调用this.getSomething()
。由于require
调用是异步的,我能否以某种方式返回一个promise
可this.getSomething()
用于确保按顺序调用这两个函数的方法?如果是这样,那怎么办?
阿西姆
更新
使用保罗的想法,这是我处理我的情况的方法:
function RequirePromise (pListDeps, oContext, fnFunc)
{
return $.Deferred(function(oDef)
{
require(pListDeps, function()
{
var pArgs = [];
if (fnFunc)
{
if (oContext) fnFunc = _.bind(fnFunc, oContext);
pArgs.push(fnFunc.apply(fnFunc, arguments));
}
oDef.resolveWith(oContext, _.union(pArgs, arguments));
});
}).promise();
}
pListDeps
是要加载的依赖项列表。oContext
是要在其中的承诺函数的首选默认上下文。fnFunc
是在给定函数中运行的可选函数(不链接到then
函数)。函数的返回值可用作then
/中的第一个参数done
。加载的依赖项可作为第二个参数使用。我可以将其用作以下任何一种:
RequirePromise(['app'], this).done(function(App) { console.log(arguments); }
RequirePromise(['app'], this, function(App) { console.log(App); return true; })
.done(function(oRet, App) { console.log(arguments); }
RequirePromise(['app'], this)
.then(function() { return RequirePromise(['subapp']); })
.done(function() { console.log('Both app and subapp loaded!'); }
谢谢保罗=)