4

Rails アプリでメッセージを削除するために、javascript で HTTP POST/DELETE リクエストを作成しています。

 $.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 リクエストがキャンセルされたときにまだ実行されているためです。メソッドで success パラメータを使用できます$.post()

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

そうは言っても、この種のことは ajax の目的に反します。

于 2012-10-05T05:29:52.763 に答える
1

ページがアンロードされると、すべての AJAX リクエストがキャンセルされるためです。

AJAX 呼び出しは非同期であるため、リロードの呼び出しはすぐに行われ、要求はキャンセルされます。

成功のコールバックに追加して、AJAX 呼び出しが終了するまで待つ必要があります。

于 2012-10-05T05:32:28.260 に答える