如果您查看下面的功能,请在第11行alert(template);
处查看。它打印undefined
。如果我在ajax成功回调中alert(template);
,它打印没有问题。由于模板是在函数顶部定义的,因此整个函数不应该是全局的吗?有人可以帮助我吗?
function load_template(path, data, callback){
var template;
$.ajax({
url: path,
success: function(uncompiled_template){
template = Handlebars.compile(uncompiled_template);
}
});
alert(template);
if(callback){
callback(template, data);
}else{
return template(data);
}
}
答案 0 :(得分:8)
不,这不是范围问题,而是时间问题。
AJAX调用是异步的,因此成功回调会在响应到来时运行。当您尝试使用它时,该变量尚未设置。
您无法从函数返回值,因为在您退出函数之前,成功回调永远不会运行。始终使用发送到函数的回调:
function load_template(path, data, callback){
$.ajax({
url: path,
success: function(uncompiled_template){
var template = Handlebars.compile(uncompiled_template);
callback(template, data);
}
});
}
答案 1 :(得分:1)
ajax是异步的。用简单的术语来解释:ajax 就像一样运行在一个单独的“线程”上,在你的代码继续的同时在后台处理。
当您致电load_template()
时,它会在$.ajax()
被称为之后但在返回模板之前发出警报,因此undefined
。
你能做的就是这样一切都在成功回归后运行:
function load_template(path, data, callback){
$.ajax({
url: path,
success: function(uncompiled_template){
var template = Handlebars.compile(uncompiled_template);
alert(template);
if(callback){
callback(template, data);
}else{
return template(data);
}
}
});
}
答案 2 :(得分:0)
模板尚未定义。
这就是为什么它在成功函数中表现良好。
不确定是什么框架(我认为是JQuery)但你需要在ajax成功函数中进行回调。
答案 3 :(得分:0)
success
函数是回调。 javascript引擎向服务器发出请求,当服务器响应数据时,然后它运行success
函数并且你有数据,所以success
函数在结束后在之后运行,即使事先定义了它。
Javascript代码在Event Loop内运行,所有$.ajax
正在做的是启动一个异步事件并指定该事件发生时该怎么做。