Javascript 如何将同步ajax转换为异步ajax?

Javascript 如何将同步ajax转换为异步ajax?,javascript,jquery,ajax,asynchronous,coffeescript,Javascript,Jquery,Ajax,Asynchronous,Coffeescript,我正在努力完成的事情 我试图检查服务器时间,并将其与预设的关闭时间进行比较,以防止用户单击过期的销售项目(并显示该项目已过期),但我遇到了一个障碍,即当它与同步调用混合在一起时,如何实现这一点 我知道async:false是一个非常糟糕的主意,它在Firefox中不起作用(在Chrome和IE中也能起作用),但它正是我想要的。我很难弄清楚如何将代码转换为异步代码。如果我更改了异步代码的一部分,那么依赖于它的所有其他代码部分都会崩溃,因为时间已经过了 前一个代码-如果销售结束,我会调用的所有代码(

我正在努力完成的事情

我试图检查服务器时间,并将其与预设的关闭时间进行比较,以防止用户单击过期的销售项目(并显示该项目已过期),但我遇到了一个障碍,即当它与同步调用混合在一起时,如何实现这一点

我知道async:false是一个非常糟糕的主意,它在Firefox中不起作用(在Chrome和IE中也能起作用),但它正是我想要的。我很难弄清楚如何将代码转换为异步代码。如果我更改了异步代码的一部分,那么依赖于它的所有其他代码部分都会崩溃,因为时间已经过了

前一个代码-如果销售结束,我会调用的所有代码()

我想做的事,但没用

咖啡脚本

中的相同代码

Javascript:

这是正确的吗

是否希望更改我的所有销售结束代码

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