2012-02-06 71 views
1

仍然让我对CoffeeScript感兴趣,并看到它的功能。返回Coffeescript中的Ajax请求的结果

我写了一个方法,使ajax调用,我想要返回结果。

例如:

GetViewedItem: (foo) -> 
    $.ajax '/Foo/Bar/', 
    type: 'GET', 
    data: { id: $(foo).data('fooId') } 
    success: (data) -> 
     data 

,我想返回数据。有没有在CoffeeScript中做到这一点的巧妙方法,还是我只需要声明一个变量?

谢谢

+0

你是否意味着“转向”异步到同步? http://stackoverflow.com/questions/6406100/how-does-coffeescript-handle-asynchronous-calls – tokland 2012-02-06 17:14:12

回答

5

您不能真正以AJAX请求的方式返回数据,因为它是异步的。意思是,在成功回调被调用的时候,你的方法将会完成执行。

通常情况下,您可以继续在成功回调中处理AJAX数据,或者从成功回调中调用相应处理数据的方法。

handleViewedItem: (data) -> 
    // Do something now that the AJAX call is complete. 

GetViewedItem: (foo) -> 
    $.ajax '/Foo/Bar/', 
     type: 'GET', 
     data: { id: $(foo).data('fooId') } 
     success: (data) -> 
      handleViewedItem data 

这可能是使用JS和AJAX时要理解的最重要概念之一。

+0

充分意识到这一点。只是不知道coffeescript是否具有渲染此代码的奇特方式。我猜不是? – 2012-02-06 17:01:57

+1

对不起,我不是故意要居高临下。我试图用一般的术语来回答问题,以帮助未来的读者。 – Sandro 2012-02-06 18:55:29

+0

如果函数需要保持异步,则不能真正返回数据。 – Sandro 2012-02-06 18:58:40

0

如前所述,这与浏览器中的异步javascript本身有关。 CoffeeScript有一个“补丁”,直接处理这个问题(添加异步/延迟),请参阅http://maxtaco.github.com/coffee-script/。对于你的榜样,它会是这样的(根据我对它的理解在我身边猜测):

GetViewedItem: (foo) -> 
    await $.ajax '/Foo/Bar/' 
    type: 'GET' 
    data: { id: $(foo).data('fooId') } 
    success: defer data 
    data 

还有许多其他的JavaScript库,以及它也可以用于类似用途。但请注意,当脚本正在等待数据时,浏览器可能会“挂起”(不确定“延迟”功能是否继续处理javascript事件)。