我试图检查服务器时间,它与预先设置的截止时间,以防止用户点击过期出售的物品比较(并显示该项目已过期),但我打如何实现这一点,当它与同步呼叫混合时
我知道async:false是一个非常糟糕的主意,它不会在Firefox中工作(适用于Chrome和IE),但它确实如我所愿。我很难搞清楚如何将我的代码转换为异步。如果我将部分代码更改为异步,那么依赖于代码的所有其他代码部分都会崩溃,因为时序已关闭。
前面的代码 - 所有如果sale_closed我会叫()
@get_server_time: (url) ->
$.ajax(
url: url + '/servertime'
type: 'GET'
async: false
)
@sale_closed:() ->
if not @is_valid_user
return true
if Config.override_bid_closed?
return false
if @get_server_time(url) > sale_end
return true
return false
我试图这样做,但是,这不是在工作
CoffeeScript的
@get_server_time: (url) ->
$.ajax(
url: url + '/servertime'
type: 'GET'
)
@sale_closed:() ->
@get_server_time(url).done (data) ->
if not @is_valid_user
return true
if Config.override_bid_closed?
return false
if data > sale_end
return true
return false
相同的代码
的Javascript:
function get_server_time (url) {
return $.ajax({
url: url + '/servertime',
type: 'GET'
});
};
function sale_closed() {
get_server_time(url).done(function(data) {
if (!this.is_valid_user()) {
return true;
}
if (Config.override_sale_closed != null) {
return false;
}
if (data > sale_end) {
return true;
}
return false;
});
};
这是正确的吗?
是期望从
foo:() ->
if sale_closed()
/* do something */
改变我的所有sale_close代码
do_something:() ->
/* do something */
foo:() - >
sale_closed(do_something)
这是一个巨大的噩梦,因为我不得不改变了很多代码,并会令他们所有的异步其中可能会打破所有其他调用'foo','foo2'等的函数(之前是同步的)。
是否有任何东西保证变量do_something读取将在上下文中,并执行时具有相同的值?
感谢您的帮助,我试图总结我的头周围此
+1
如果你想要异步代码,那么你需要有回调,当ajax调用完成/返回时可以触发。这些回调是你如何将各个阶段联系在一起的。 a)发送数据到服务器b)主代码到达其他地方c)当ajax调用返回时,回调触发并开始做任何事情 –
+0
展开'@ sale_closed'看起来更像'@sale_closed :(回调) - > .. .'并且在'@ sale_closed'里面说'callback(whatever)'而不是'return whatever'。然后把'sale_closed'主叫从里面翻出来。 –
+0
这不是我想要的异步代码,它是Firefox不支持async:false,因为他们严格执行CORS(基于我在bugzilla和这里阅读的内容),这意味着我必须重写我的代码才能工作与异步。 你是两个说我在**中描述的是这是正确的**部分?我只是想确定我理解它是正确的,因为这意味着我将所有当前的代码放在一个接受'(任何)'的函数中,而不是仅仅改变'@ sale_closed'函数的东西,我有'if @ saled_closed'要改变所有调用它的代码 –