Javascript 如何将同步ajax转换为异步ajax?
我正在努力完成的事情 我试图检查服务器时间,并将其与预设的关闭时间进行比较,以防止用户单击过期的销售项目(并显示该项目已过期),但我遇到了一个障碍,即当它与同步调用混合在一起时,如何实现这一点 我知道async:false是一个非常糟糕的主意,它在Firefox中不起作用(在Chrome和IE中也能起作用),但它正是我想要的。我很难弄清楚如何将代码转换为异步代码。如果我更改了异步代码的一部分,那么依赖于它的所有其他代码部分都会崩溃,因为时间已经过了 前一个代码-如果销售结束,我会调用的所有代码() 我想做的事,但没用 咖啡脚本 中的相同代码 Javascript: 这是正确的吗 是否希望更改我的所有销售结束代码Javascript 如何将同步ajax转换为异步ajax?,javascript,jquery,ajax,asynchronous,coffeescript,Javascript,Jquery,Ajax,Asynchronous,Coffeescript,我正在努力完成的事情 我试图检查服务器时间,并将其与预设的关闭时间进行比较,以防止用户单击过期的销售项目(并显示该项目已过期),但我遇到了一个障碍,即当它与同步调用混合在一起时,如何实现这一点 我知道async:false是一个非常糟糕的主意,它在Firefox中不起作用(在Chrome和IE中也能起作用),但它正是我想要的。我很难弄清楚如何将代码转换为异步代码。如果我更改了异步代码的一部分,那么依赖于它的所有其他代码部分都会崩溃,因为时间已经过了 前一个代码-如果销售结束,我会调用的所有代码(
foo: () ->
if sale_closed()
/* do something */
到
这是一个巨大的噩梦,因为我必须更改很多代码,使它们都是异步的,这可能会破坏所有其他调用“foo”、“foo2”等的函数(以前是同步的)
是否有任何东西可以保证读取的变量在上下文中,并且在执行时具有相同的值
谢谢你的帮助,我试着把我的头围绕着这个
尝试进行一些日志记录,如果问题是您无法访问功能
@is\u valid\u user
,请尝试更改此功能
@get_server_time(url).done (data) ->
对此
@get_server_time(url).done (data) =>
胖箭头将done上的回调函数绑定到this
的当前上下文,因此保留调用this.is\u valid\u user
的功能。如果没有更大的代码上下文,很难说这是否适用于您,但我可能会先尝试一下
这是正确的吗
不是真的。您不能像在同步代码中那样从异步回调中返回。相反,您将希望使用承诺:
@get_server_time: (url) ->
$.ajax(
url: url + '/servertime'
type: 'GET'
)
@sale_closed: () ->
if not @is_valid_user
return $.when true
if Config.override_bid_closed?
return $.when false
@get_server_time(url).then (data) ->
data > sale_end
是否期望更改所有调用sale_close的代码
是的,您需要将所有内容更改为回调样式。有了承诺,变化不会很大,流量保持线性
是否有任何东西可以保证读取的变量在上下文中,并且在执行时具有相同的值
您应该在foo
函数中本地声明do\u something
(或者只使用函数表达式),这将保证您需要的所有变量都在范围内。如果需要正确的上下文,请使用fat arrow函数。如果需要异步代码,则需要在ajax调用完成/返回时触发回调。这些回调是将各个阶段链接在一起的方式。a) 将数据发送到服务器b)主代码转到其他地方c)当ajax调用返回时,回调启动并开始执行它所做的任何操作roll@sale\u closed
,看起来更像@sale\u closed:(回调)->…
,并说回调(无论什么)
而不是返回@sale\u closed
内的任何内容。然后把sale\u closed
调用者翻过来。我不是很想要异步代码,而是Firefox不支持async:false,因为它们在CORS上严格执行(基于我在bugzilla和这里读到的内容),这意味着我必须重写代码才能使用异步。你们两个是说我在这一节中描述的是正确的吗?我只是想确定我理解的是正确的,因为这意味着如果@saled_closed
之后出现的所有当前代码都将填充到一个接受(无论什么)
的函数中,而不是仅仅更改@sale_closed
函数,我必须更改它实际调用的所有代码,对于那些对异步性感到困惑的用户,我不建议使用承诺,因为它们倾向于添加另一层间接性,根据我的经验,不值得这样做。这里需要理解的重要一点是,您的预感是正确的,您将不得不更改许多代码。运气不好,但是一个异步函数确实意味着您的所有程序现在都是异步的。这是一个很棒的装置,很有感染力。我确实得到了OP的印象,它太依赖浏览器了。要知道,无论你们在客户端做什么业务逻辑,一个恶意的客户端都可能伪造。谢谢你们两位确认了我最担心的事情。我更习惯于服务器端脚本+轻javascript,但我继承的这个新项目不允许这种奢侈。它只是让我惊讶,一个简单的服务器时间,我能够做的一行代码之前和现在已经变成了一个巨大的怪物。看来我得用另一种方法来伪造服务器时间
do_something: () ->
/* do something */
foo: () - >
sale_closed(do_something)
@get_server_time(url).done (data) ->
@get_server_time(url).done (data) =>
@get_server_time: (url) ->
$.ajax(
url: url + '/servertime'
type: 'GET'
)
@sale_closed: () ->
if not @is_valid_user
return $.when true
if Config.override_bid_closed?
return $.when false
@get_server_time(url).then (data) ->
data > sale_end