2012-03-12 26 views
0

我是Coffeescript的新手,我有一個關於Ajax的問題​​。CoffeeScript ::我不知道爲什麼使用ajax時返回函數體

jQuery -> 
    api = 
    getId: -> 
     res = [] 
     $.ajax 
     dataType: "jsonp" 
     url: "http://localhost:3004/videos.json" 
     success: (data) => 
      if data 
      data.forEach (elem) => 
       embed_id = elem.video_id 
       res.push(embed_id) 
      console.log res 
      return res 

我試試這個代碼,然後

console.log res 

輸出

["id1","id2","id3",...] . 

因此,我希望api.getId()返回["id1","id2","id3",...] 相反,我看到

Object 
    -> abort 
    function(a) {...} 
    ... 
    -> status: 200 
    ... 
    -> success: function(){...} 

在我的調試窗口中。

我想返回響應的值。

回答

0

return res語句是AJAX調用裏面。它不是返回從getId()功能,但內部AJAX回調。你不能這樣做。 AJAX調用是異步的,而你希望它們是同步的。我會建議你做這樣的事情:

jQuery -> 
    api = 
    getId: (callback) -> 
     res = [] 
     $.ajax 
     dataType: "jsonp" 
     url: "http://localhost:3004/videos.json" 
     success: (data) => 
      if data 
      data.forEach (elem) => 
       embed_id = elem.video_id 
       res.push(embed_id) 
      callback(res) 
      else 
      callback(null) 
     error: => 
      callback(null) 

,現在在代碼中你可以使用

api.getId(function(res) { 
    // do something with the result. 
}); 
// some other things 

記住的是,some other things代碼可以(並且會)的do something with the result代碼之前被調用。

不好意思將JavaScript與JavaScript混合使用,但我並沒有真正使用CoffeeScript。

1

這不是一個真正的Coffeescript問題,這只是異步請求的工作方式。您不能立即返回XHR調用的結果,您必須定義一個回調,該回調在調用完成後得到結果(或錯誤)。

看看你的代碼編譯爲(如Javascript)。

getId: -> 
    ## .. snip .. 
    $.ajax ## .. snip .. 

你有一個函數getId,它返回的$.ajax的返回值,這是(根據jQuery的規範)的XHR對象,而不是成功回調的結果。您可以使用它來檢查進度,中止請求,設置更多選項等。

success: (data) => 
     ## .. snip .. 
     return res 

從XHR成功回調中返回任何東西都沒有意義。你需要在這裏處理數據,例如把它放到某個地方的DOM中,或者調用另一個對它有用的功能。

相關問題