Javascript 为什么window.location.reload()否定了前面的命令?

Javascript 为什么window.location.reload()否定了前面的命令?,javascript,ruby-on-rails-3,Javascript,Ruby On Rails 3,我正在用javascript发出HTTP POST/DELETE请求,以删除rails应用程序中的消息 $.post(message_url, { _method: 'delete' }, null, "script"); 如果在执行这一行后刷新页面上的浏览器,我会看到消息实际上已被删除,不再显示 现在,我希望页面在执行此命令后自动刷新,以便用户看到其消失。我有以下几行: $.post(message_url, { _method: 'delete' }, null, "script

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

 $.post(message_url, { _method: 'delete' }, null, "script");
如果在执行这一行后刷新页面上的浏览器,我会看到消息实际上已被删除,不再显示

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

    $.post(message_url, { _method: 'delete' }, null, "script");
    window.location.reload();
现在页面确实刷新了,但是消息不再被删除。我在控制台中没有看到任何错误

所以基本上,没有这个重载();命令消息删除得很好,但如果我添加此reload()行,它将停止工作。为什么会这样


更重要的是,我如何才能完成我要做的事情?

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

也就是说,这种方式违背了ajax的目的。

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

解决方案是在
$完成后执行
reload()
。post
调用:

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

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

因为AJAX调用是异步的,所以重新加载的调用会立即发生,请求被取消


您必须等待AJAX调用完成,然后将其添加到success callback

@pejmanjohn。没问题。您确定要刷新页面吗?如果在刷新之前立即使用AJAX,这似乎很愚蠢-您还可以允许正常的表单提交。在删除后执行的操作是retrieve t创建新的“消息”列表并显示它们……或者简单地删除已删除的“消息”所在的容器(有效地将其从页面中删除,并禁止进一步的交互。感谢进一步的输入。我实际上希望刷新(出于用户体验的原因,这是一个相当严重的操作&它实际上可以更清楚地表明发生了什么).有趣的是,我以前总是通过AJAX做这些事情,因此我不知道如何编写一个正常的表单提交。因此,我问了这么一个奇怪的问题。@pejmanjohn我完全是出于UX的原因,但我不认为页面刷新才是真正应该做的(不过我想这只是我的意见)。您有许多选项/组合,但不限于:成功时显示的模式、“加载”微调器/覆盖、页面上的一些通知(无论是内容的闪烁、使用的新颜色等),或者只是说发生了什么以及什么时候发生的消息。
fadeOut
fadeIn
以及大量其他jQuery动画非常有用:)
$.post(message_url, { _method: 'delete' }, function () {
    window.location.reload();
}, "script");