2012-02-17 56 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正在執行的操作是啓動異步事件並指定發生該事件時要執行的操作。