为什么window.location.reload()否定了上一个命令?

时间:2012-10-05 05:26:45

标签: javascript ruby-on-rails-3

我在javascript中发出HTTP POST / DELETE请求以删除我的rails应用程序中的消息

 $.post(message_url, { _method: 'delete' }, null, "script");

如果我在执行此行后刷新页面上的浏览器,我发现该消息实际上已被删除且不再出现。

现在我希望页面在此命令后自动刷新,以便用户看到它消失了。我有以下几行:

    $.post(message_url, { _method: 'delete' }, null, "script");
    window.location.reload();

现在页面确实刷新了,但消息不再被删除。我在控制台中没有看到任何错误。

所以基本上没有这个reload();命令消息删除就好了,但是如果我添加这个reload()行就会停止工作。为什么会这样?

更重要的是,我怎样才能完成我想要做的事情?

3 个答案:

答案 0 :(得分:5)

“问题”是$.post是异步的。这意味着当你调用它时,它会向服务器发出一个AJAX请求(删除该消息)。由于它是异步的,因此Javascript继续运行(它不会等待AJAX​​请求完成以继续运行其余代码(window.location.reload())。由于它不等待,{{1}在请求被触发后立即运行并且可能已中止(因为浏览器被重定向到新页面,这是默认行为)。

解决方案是在完成window.location.reload()调用时执行reload()

$.post

http://api.jquery.com/jQuery.post/

答案 1 :(得分:3)

在刷新页面之前,你必须等到ajax请求完成,因为ajax是异步的,当取消ajax请求的window.location.reload();时它仍然被执行。您可以使用$.post()方法中的success参数。

$.post(message_url, { _method: 'delete' }, function(){window.location.reload();}, "script");

话虽这么说,这种方式违背了ajax的目的。

答案 2 :(得分:0)

这是因为当页面卸载时,所有AJAX请求都会被取消。

由于AJAX调用是异步的,因此立即调用重新加载并取消请求。

您必须等到AJAX通话完成后才将其添加到成功回调