Created
February 9, 2016 11:25
-
-
Save suneo3476/c8f764708b46652667c9 to your computer and use it in GitHub Desktop.
Q. $.ajax#doneで得られたdataを元にコールバック関数内で外側のループを抜けるにはどうしたらよい?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var hoge_func = function(){ | |
var count = 0; | |
while(true){ | |
var request = $.ajax({ | |
type:"POST", | |
url:"getData.php", | |
data: {count: count} | |
}); | |
request.done(function(data){ | |
if(data == null){ | |
//I wanna finish while loop!!! | |
} | |
}) | |
count += 100; | |
} | |
} |
終了フラグを用意してポーリングすれば実現できるでしょうか?
var hoge_func = function () {
var count = 0;
var finished = false; // 終了フラグ
while (!finished) {
var request = $.ajax({
type: "POST",
url: "getData.php",
data: { count: count }
});
request.done(function (data) {
if (data === null) {
finished = true; // クロージャなので外の変数が見える
}
}); // セミコロンが抜けてました
count += 100;
}
}; // この書き方では function は式なのでセミコロンが必要
ただ、それ以前の問題として、せっかく ajax で非同期通信しているのに、while
ループでブロックしてその間ブラウザを固まらせてしまうのは変な気がします。うまく状態を組んでやって、最後までノンブロックで通すようにはできないでしょうか?
非同期通信の逐次処理については、jQuery なら Deferred、ES6 なら Promise があるようです。
これをこっそり記事(の中に使用する例題)にしたので事後報告しておきます。
JavaScriptは如何にしてAsync/Awaitを獲得したのか Qiita版
DeferredでもPromiseでも同様なのですが、Generator/Iteratorもしくはtj/coライブラリもしくはasync/awaitを使わない場合(つまり純粋なDeferredやPromiseだけの使用)の場合は、先の通り、どうあがいても再帰処理を記述する必要があります。
そういうことを淡々と書いてる記事です。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
どうしてもwhile(true)では解決できないんだけれども、再帰的に呼び出す(※厳密な意味での再帰ではない)ことをすれば出来ますね。
やりたい処理はこんな感じかな?