2012-02-17 20 views
0

如果你看下面的功能,在第11行的地方alert(template);。它打印undefined。如果我在里面的ajax成功回调,它打印没问题。由于模板是在函数的顶部定义的,不应该在整个函数中是全局的吗?有人可以帮助我吗?不确定变量未定义的原因。可能的范围问题?

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); 
    } 
} 

回答

8

不,这不是一个作用域的问题,这是一个时间问题。

AJAX调用是异步的,所以成功回调会在稍后响应到达时运行。当您尝试使用它时,该变量尚未设置。

您不能从函数返回值,因为成功回调从未运行,直到您退出该函数。始终使用发送至该功能的回叫:

function load_template(path, data, callback){ 

    $.ajax({ 
     url: path, 
     success: function(uncompiled_template){ 
      var template = Handlebars.compile(uncompiled_template); 
      callback(template, data); 
     } 
    }); 

} 
+0

好的。这就说得通了。我将如何去从load_template函数返回模板变量。建议吗? – Kylee 2012-02-18 00:00:31

+0

@Kylee:如果您确实需要返回值,您可以改为同步AJAX调用(在设置中使用'async:false')。但是,它会冻结整个浏览器,等待响应。 – Guffa 2012-02-18 00:02:54

+0

好的。不是加载和渲染模板的最佳解决方案。感谢您的后续答复。 – Kylee 2012-02-18 00:04:31

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); 
      } 
     } 
    }); 
} 
0

在您的ajax请求完成之前,模板未定义。

这就是为什么它显示在成功功能罚款。

不知道是什么框架(我假设JQuery),但你需要在ajax成功函数中做回调。

0

success函数的回调函数。 JavaScript引擎发出请求到服务器,当服务器响应数据,然后它运行success功能,你有数据,所以success功能运行后你如果在最后声明中,甚至尽管事先定义了它。

Javascript代码在Event Loop内部运行,所有$.ajax正在执行的操作是启动异步事件并指定发生该事件时要执行的操作。