gpt4 book ai didi

coffeescript - 如何使用 Coffeescript 和 Rails 3.1 定义回调函数?

转载 作者:行者123 更新时间:2023-12-03 09:28:56 24 4
gpt4 key购买 nike

在我看来我想要:

:coffeescript
Gmap('#canvas').getAddressBounds request.term

在 maps.js.coffee 中定义为

Gmap = (mapId) ->
getAddressBounds: (address) ->
data = []
$(mapId).gmap3
action: 'getAddress'
address: address
callback: (results) ->
return unless results
data = $.map results, (item) ->
bounds: item.geometry.bounds
data

虽然这不起作用。首先,有一个范围问题。 Gmap 函数对 View 中的脚本不可见。如果我将代码直接添加到 View 中,Gmap 是可见的,但数据总是返回为 []。

最佳答案

发生的事情是您将异步代码视为同步代码。一些调试输出可能会帮助您形象化:

Gmap = (mapId) ->
getAddressBounds: (address) ->
data = []
console.log '1: Calling gmap3'
$(mapId).gmap3
action: 'getAddress'
address: address
callback: (results) ->
console.log '3: Callback called'
return unless results
data = $.map results, (item) ->
bounds: item.geometry.bounds
console.log '2: Returning data'
data

当您传递回调时,它可能会随时被调用。如果在 gmap3 函数期间调用它,那么 data 确实会在返回之前设置。但是 gmap3 使用回调来返回其结果而不是仅仅返回的原因是该函数是异步的——特别是,它会在服务器响应您的查询时调用回调。 JavaScript 处理事件的方式,这意味着您的回调保证不会在所有代码执行完毕之前被调用。

在 JavaScript(或 CoffeeScript)中无法将异步函数包装在同步函数中;即使在调用回调之前运行无限循环也行不通,因为 JS 运行时在所有代码执行完毕之前不会处理服务器响应(甚至用户输入事件)等事件。因此,您所能做的就是也更改您的函数以使用回调:

Gmap = (mapId) ->
getAddressBounds: (address, cb) ->
$(mapId).gmap3
action: 'getAddress'
address: address
callback: (results) ->
return unless results
cb $.map results, (item) ->
bounds: item.geometry.bounds

然后这样调用:

 Gmap('#canvas').getAddressBounds request.term, (data) -> console.log data

我在 my CoffeeScript book 中详细讨论了 JS 事件模型.此外,John Resig 的 How JavaScript Timers Work是必读的。异步性需要一些时间来适应,但与多线程相比的好处是惊人的。

关于coffeescript - 如何使用 Coffeescript 和 Rails 3.1 定义回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com