我正在使用RequireJS来构建我当前的JS项目,并且我有一些库/ jQuery插件需要在可以使用之前进行初始化。初始化是异步的,返回时将调用回调。因此,下面的代码引入了竞争条件(依赖性加载和已初始化?):
dep_that_needs_to_be_initialized_before_it_can_be_used.js:
define(
['raw_library_source'],
function(){
// this init call is async and will invoke the callback when done
// $ is global
$.plugin.init({
//config
},callback);
}
);
app.js:
define(
['dep_that_needs_to_be_initialized_before_it_can_be_used'],
function(){
// the following line may fail in case the dependcy is not yet initialzed
$.plugin.doSomething();
}
);
有没有人知道我怎么能要求依赖'wait'(也就是同步),直到库也被初始化了?
答案 0 :(得分:2)
我通常这样做的方法是从插件包装器模块返回一个包装器函数,然后使用回调调用返回的包装器函数。结合模块关闭中的标志来指示插件是否已经初始化,我认为你有一个解决方案。
示例:
//pluginWrapper.js
define(
['jquery', 'plugins/jquery.plugin'],
function($) {
var isInitialized = false;
return function (callback) {
if (isInitialized) {
callback();
} else {
$.plugin.init({}, function() {
isInitialized = true;
callback();
});
}
};
}
);
然后,在您想要使用插件的任何模块中,您可以:
define( ['jquery', 'pluginWrapper'],
function($, pluginWrapper) {
pluginWrapper(function() {
// use the plugin here. it will be initialized.
}
}
);
AMD模块和javascript关闭很棒,但是当你刚刚掌握它们时,两者都会有点混乱。