当另一个函数存在时执行javascript

Ben*_*ack 7 javascript jquery

我在Web环境中编写了两个脚本,我无法控制它们的加载顺序.比方说,两个脚本被称为MyUtilDoSomething.

MyUtil包含我将使用绑定到window对象的实用程序window.myUtil = myUtil.然后,我myUtil将从内部调用方法DoSomething.

如果MyUtil首先加载,一切都会工作.如果它加载第二,window.myUtil将是undefined.

如何在执行代码之前修改DoSomething(和/或MyUtil)中的代码以等到window.myUtil存在DoSomething

注意:我正在使用jQuery 1.2.3.

Aar*_*paa 7

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()确保他们使用相同的延期.


Eam*_*orr 0

像这样的东西会起作用吗?

 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)