Javascript 为什么window.location.reload()否定了前面的命令?
我正在用javascript发出HTTP POST/DELETE请求,以删除rails应用程序中的消息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
$.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");