我在javascript中发出HTTP POST / DELETE请求以删除我的rails应用程序中的消息
$.post(message_url, { _method: 'delete' }, null, "script");
如果我在执行此行后刷新页面上的浏览器,我发现该消息实际上已被删除且不再出现。
现在我希望页面在此命令后自动刷新,以便用户看到它消失了。我有以下几行:
$.post(message_url, { _method: 'delete' }, null, "script");
window.location.reload();
现在页面确实刷新了,但消息不再被删除。我在控制台中没有看到任何错误。
所以基本上没有这个reload();命令消息删除就好了,但是如果我添加这个reload()行就会停止工作。为什么会这样?
更重要的是,我怎样才能完成我想要做的事情?
答案 0 :(得分:5)
“问题”是$.post
是异步的。这意味着当你调用它时,它会向服务器发出一个AJAX请求(删除该消息)。由于它是异步的,因此Javascript继续运行(它不会等待AJAX请求完成以继续运行其余代码(window.location.reload()
)。由于它不等待,{{1}在请求被触发后立即运行并且可能已中止(因为浏览器被重定向到新页面,这是默认行为)。
解决方案是在完成window.location.reload()
调用时执行reload()
:
$.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通话完成后才将其添加到成功回调