前回まででJSDeferredの基本的な使いかたを説明しました。
今回は
UIスレッド
JavaScriptが担当するアプリケーションユーザインターフェイスの
JavaScriptを実行するブラウザには,
JavaScriptは,
UIスレッドの実行をできるだけ止めない
UIスレッドを長時間
リスト1
var n = 1000000;
for (var i = 0; i < n; i++) {
// do something
}
では,
setTimeout()関数は指定時間後に指定した関数を実行する関数ですが,
リスト2
setTimeout(function () {
// do something
}, 0);
例えば,
リスト3
var n = 1000000;
var i = 0;
setTimeout(function () {
if (i < n) {
// do something
i++;
setTimeout(arguments.callee, 0);
}
}, 0);
単純にforのループの切れ目でsetTimeoutするようにしただけですが,
全体が非同期の流れになっているので,
JSDeferredを使うようにする
では,
リスト4
var n = 1000000;
var i = 0;
next(function () {
if (i < n) {
// do something
return next(arguments.callee);
}
}).
next(function () {
alert('done');
});
とりあえずこれで,
とはいっても,
リスト5
var n = 1000000;
loop(n, function (i) {
// do something
}).
next(function () {
alert('done');
});
とても簡単になりました! UIもブロックせず簡潔です。ただし,