4

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

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

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

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

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

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

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

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

4

3 回答 3

5

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

解决方案是执行调用reload()完成$.post

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

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

于 2012-10-05T05:30:13.580 回答
3

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

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

话虽如此,这种方式违背了ajax的目的。

于 2012-10-05T05:29:52.763 回答
1

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

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

You have to wait until the AJAX call is finished by adding it to success callback

于 2012-10-05T05:32:28.260 回答