最後の投稿から約2年も更新が途絶えてたブログになります。今更感はありますが、自分自身のためにも残しておきたいと思い、久しぶりのプログラミング(jQuery)に関する投稿です。誰かもきっと悩んでるはず!
スポンサーリンク
同期処理ではローディングが表示されない
次のソースは、まず、ローディングを表示させます。と思いきや表示されません。表示されればよいのですが、されないものはされません。いろいろなサイトやブログで言及されていますが、同期と非同期の動きの違いによるもので非同期ならばローディングが開始されますが、以下のような同期呼び出しだとローディングが表示されません。
// 同期処理でWebAPIを呼び出す関数 function async_false_func() { var url = './url/desu/'; // ローディング(くるくる回ったりなんか動くやつ) // ↓ これは動かない。残念。 $('.loading').fadeIn(); // 処理時間のかかるAPIだと動きがわかりやすい $.ajax({ type:"GET", url: url, async: false, }).done(function(res) { // OK // ローディングを非表示 $('.loading').fadeOut(1000); }).fail(function() { // NG // ずっと動いてろ! }); }
ポイントは、ajax のパラメータに async: false をつけて呼び出している点です。デフォルト値である async: true(非同期) であればローディングは動きます。ただし、async: false(同期)だと、ローディング処理が動きません。
また、async: false は非推奨だとか言われますが、同期で動かしたい場面はあったりします。そしてローディングも動かしたいのです。ではどうするか?
次のソースを見てください。とりあえず、次のようにすることでローディング処理を動作させることができました。
なお、async_false_func関数内のローディングの開始と終了処理は削除してあります。
var promise = function (param) { return new Promise(function (resolve, reject) { // メインスレッドとは別スレッドで同期APIを呼び出す setTimeout(function () { async_false_func(); // 同期API呼び出し resolve(); // 完了 }, 0); }); }; // ローディング $('.loading').fadeIn(0); promise().then(function (success) { // ローディング終了 $('.loading').fadeOut(1000); // その他の処理(あれば) });
とりあえず動いたからよし!