test(); //非同期処理
test2(); //同期処理
非同期処理があると、行数的に前に記述した処理を終える前に
後に記述した処理を先に実施することがある。
javascripは基本非同期だが、同期的に前の処理が終わってから
後の処理を実施する方法について検討する。
1.前の関数に処理完了後のコールバック関数を設定する
test(arg1,test2);
test2();
/*クラスを使った場合のイメージ*/
test = new ClassA(arg, function(result) {console.log(result);});
function ClassA(arg, callback) {
if(条件) {
callback(結果等); //引数で指定していたcallback関数の呼び出し
}
}
2.いっそのこと前の関数の中に書く。
test(arg) {
//何らかの処理
test2();
}
3.yieldを使う。
/*html側でjavascript1.7以降であることを宣言*/
<script type="text/javascript;version=1.8" src="test.js"></script>
/*javascript側(test.js)*/
function test() {
var generator = test2();
generator.next(); //処理1の実行
generator.next(); //処理2の実行
}
function test2() {
//処理1
yield;
//処理2
yield;
}
4.jquery.defferedやjsdefferedを使う。
function test() {
var promise = test2();
promise.done(function(){
console.log($("#sentence").css("display"));}
);
}
function test2() {
var hoge = $.Deferred();
$("#sentence").fadeOut(3000,function(){hoge.resolve();});
return hoge.promise();
}
※fadeOut関数であれば、コールバック関数にconsole.log($("#sentence").css("display"));を
仕込めば良いですが…
9.処理完了フラグを設けて、ひたすら無限ループで待つ…というのは、javascriptは
単一スレッドのため、if文で無限ループに陥ってかえって来れなくなる恐れがあるので
ダメそう。
function test() {
//非同期処理をここに書く
loop:while(true) {
if(非同期処理が終わった時にtrueになる条件[フラグ]) {
//処理
break loop;
}
}
}
関連
最終更新:2020年09月18日 07:43