JavaScript:関数終了時のトリガーアクション
-
02-07-2019 - |
質問
JavaScript関数の終了をリッスンする方法はありますか?関数が完了したときに設定できるトリガー?
AJAX オブジェクトが DB からデータを取得しているときにユーザー インターフェイス難読化手法 (BlockUI) を使用しようとしていますが、関数呼び出しの最後に関数を配置した場合でも、関数が最後に実行されるとは限りません。
例:
function doStuff() {
blockUI();
ajaxCall();
unblockUI();
};
unBlockUI を起動する前に、doStuff が ajaxCall が完了するのをリッスンする方法はありますか?そのままでは、関数が線形に処理され、各オブジェクトが順番に呼び出され、それぞれを完了するために別個のスレッドが生成されます。したがって、AJAX 呼び出しが完了するまでに 10 ~ 15 秒かかる場合がありますが、関数の線形実行により、ユーザーをブロックしているのはほんの一瞬だけです。
これを回避するには、あまり洗練されていない方法があります。AJAX 関数によって設定された戻り値が true に設定された場合にのみループを終了する、またはそれに類する方法があります。しかし、それは不必要に複雑で非効率的であるように思えます。
解決
Ajax ルーチンをどのように実行しても、必要なのは、完了後に実行される「コールバック」関数です。
function ajaxCall(callback){
//do ajax stuff...
callback();
}
それから:
function doStuff(){
blockUI();
ajaxCall(unblockUI);
}
他のヒント
同期xhrを実行できます。これにより、通話中に (どれだけ時間がかかるかに関係なく) UI 全体がブロックされます。
応答の処理後に呼び出されるコールバック関数を指定するなど、非同期フローと互換性があるようにプログラム フローを再設計する必要があります。プロトタイプや JQuery などの方法を確認してください。これを実現します。
答えは簡単です。ajax リクエストが結果を返すときに unblockUI() を呼び出す必要があります。jQuery を使用すると、次のように実行できます。
function doStuff(){
blockUI();
jQuery.ajax({
url: "example.com",
type: "POST", //you can use GET or POST
success: function(){
unblockUI();
}
});
}
データベースから情報が取得されている間、ユーザーに待機してもらいたいように思えます。データベースから情報を取得するために Ajax 呼び出しを行うときに行うことは、「取得しています...」というアニメーション GIF を表示することです。情報が取得されて Web ページに表示されるまで、アニメーション GIF は点滅し続けます。情報が表示されると、アニメーション GIF がオフまたは非表示になり、表示されている新しい情報にフォーカスが移動します。アニメーション GIF は、何かが起こっていることをユーザーに知らせます。