我在Web环境中编写了两个脚本,我无法控制它们的加载顺序.比方说,两个脚本被称为MyUtil和DoSomething.
MyUtil包含我将使用绑定到window对象的实用程序window.myUtil = myUtil.然后,我myUtil将从内部调用方法DoSomething.
如果MyUtil首先加载,一切都会工作.如果它加载第二,window.myUtil将是undefined.
如何在执行代码之前修改DoSomething(和/或MyUtil)中的代码以等到window.myUtil存在DoSomething?
注意:我正在使用jQuery 1.2.3.
jQuery.Deferred对象提供了一种非常优雅的方法(我知道你没有使用jQuery 1.5:我只是给你一个升级的理由;-):
假设我们有两个脚本合作如下:
// defines utilities
var util = util || { loaded: $.Deferred() };
(function(){
$.extend(util, {
msg: "Hello!"
});
util.loaded.resolve();
})();
Run Code Online (Sandbox Code Playgroud)
......和:
// uses them
var util = util || { loaded: $.Deferred() };
util.loaded.then(function(){
alert(util.msg);
});
Run Code Online (Sandbox Code Playgroud)
...在第一个脚本有机会定义它的实用程序后,无论它们加载的顺序如何,警报总是会触发.这比setTimeout基于事件的方法更有优势,因为它更容易拥有多个依赖项(使用$.when),不会不使用轮询,您不必担心明确处理加载顺序.
唯一有趣的是,所有模块都必须包括:
var util = util || { loaded: $.Deferred() };
Run Code Online (Sandbox Code Playgroud)
...并$.extend()确保他们使用相同的延期.
像这样的东西会起作用吗?
function function1(callback){
var params={
type: "POST",
url: "./ajax/doSomethingSlow.php",
data: "",
success: function(msg){
callback(msg);
},
error: function(){
callback('');
}
};
var result=$.ajax(params).responseText;
}
function1(function(){
//call function2 here:
function2();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |