Javascript 自定义库问题

Javascript custom library issue

看了又看,还是摸不着头脑。如果我遗漏了一些明显的东西,我深表歉意。我试图创建一个我自己编写的自定义函数库(感谢 Whosebug 帮助我解决了这个问题......)。然后我有一个 javascript 文件在调用网页时加载,该文件又调用我的自定义库中的所述函数。

我有一个名为 getConfig() 的函数,它的作用显而易见。它获得一个 JSON 文件,其中包含托管我所有 RESTful Web 服务的服务器的配置详细信息。当我单步执行代码时,配置详细信息如我所料返回,但是,当我全速加载网页时,配置对象返回为 undefined。我认为这可能是一个时间问题,所以我将所有内容都包装在一个 $(document).ready(function()) 块中,但没有成功。我什至尝试了一个 window.onload = function(){} 块来确保在调用自定义库之前加载所有内容。没有运气!这让我很头疼,因为我一辈子都弄不明白到底发生了什么。

我的自定义库文件看起来像这样,文件名为 xtendLibs.js

var xtendLibs = {
    getConfig           :   function(){

        var CONFIG;

        $.getJSON("/js/config.json", function(json){
            CONFIG = json;
        });
        return CONFIG;
    },
    getObjects          :   function(config, medicareno, medicarelineno, objectType){

        var object;

        var urlString = config.scheme + config.muleHost + config.mulePort + ":/patients/";

        switch(objectType){
            case ("details") : 
                urlString = urlString + "details/" + medicareno + "/" + medicarelineno ;
                break;
            case ("appointments") :
                urlString = urlString + "appointments/" + medicareno +"/" + medicarelineno;
                break;
        }

        $.ajax({
            type    :   'GET',
            url     :   urlString,
            success :   function(data){
                object = data;
            },
            failure :   function(){
                alert("Failure");
            }
        });
        return object;
    },
    getUrlParameters    :   function(){
        var paramsArray = window.location.search.substring(1).split("&");
        var obj = [];
        var tempArray;
        var paramName,paramValue;

        for(var i = 0; i < paramsArray.length; i++){
            tempArray = paramsArray[i].split("=");
            paramName = tempArray[0];
            paramValue = tempArray[1];
            obj[paramName] = paramValue;
        }

        return obj;
    }

};

调用上面文件中各种函数的javascript文件是这样的appts.js

window.onload = function(){

    var config, params, appointments;

    params = xtendLibs.getUrlParameters();   // This line works - and params is returned

    config = xtendLibs.getConfig(); // This line fails but will work if I step through the code

    appointments = xtendLibs.getObjects(    config, 
                                            params["medicareno"],
                                            params["medicarelineno"],
                                            "appointments");

    console.log(params);
}

我真的很难过。任何帮助将不胜感激。

Ajax是异步进程,所以调用getJson时不会停止下一条语句的执行。

getConfig : function(){

     var CONFIG;

     $.getJSON("/js/config.json", function(json){
          CONFIG = json;
     });
     return CONFIG;
}

调用 getJson 时,它会切换到一个新线程,并执行本例中的下一条语句 "return CONFIG;"。但是,CONFIG 尚未定义,因此返回未定义。

你怎么解决这个问题的?

您无法解决此问题。不使用此代码设计。您可以不异步 ajax,但它会使您的页面冻结。

你可以在调用"getConfig"时设置一个全局变量"config",并在执行任何涉及它的函数时检查配置变量是否定义,但最好的方法是传递一个函数,包含配置完成加载时要执行的所有语句,在 getConfig 函数中,并在“/js/config.json”加载时调用它。