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”加载时调用它。
看了又看,还是摸不着头脑。如果我遗漏了一些明显的东西,我深表歉意。我试图创建一个我自己编写的自定义函数库(感谢 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”加载时调用它。