2012-03-12 23 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中,或者调用另一个对它有用的功能。

相关问题