JSDeferred 重い処理を自動で分割する。
JSDeferred の loop 関数は軽かろうが重かろうか一回ずつ setTimeout はさむんで効率わるいので、for ループと loop 関数の間ぐらいの関数をてきとうに書いてみた。
function aloop (n, f) {
var i = 0;
var end = new Object;
var ret = null;
return Deferred.next(function () {
var t = (new Date()).getTime();
try {
do {
ret = f(i)
i++;
if (i > n) throw end;
} while ((new Date()).getTime() - t < 100)
log("Devided: " + ((new Date()).getTime() - t) + "msec.");
return Deferred.call(arguments.callee);
} catch (e) {
if (e == end) {
log("End");
return ret;
} else {
throw e;
}
}
});
}
aloop(100, function (n, o) {
var dummy = 0;
log(n);
for (var i = 0; i < n * n * n; i++) {
dummy++;
}
});関数一回の処理に 100msec 以上かかってしまったら、一度ブラウザに処理をかえす。
この例だとこんなふうになります
Firebug has been disabled for www.google.com Enable Firebug Enable Firebug for this web site http://lowreal.net/Test: 0 http://lowreal.net/Test: 1 http://lowreal.net/Test: 2 http://lowreal.net/Test: 3 http://lowreal.net/Test: 4 http://lowreal.net/Test: 5 http://lowreal.net/Test: 6 http://lowreal.net/Test: 7 http://lowreal.net/Test: 8 http://lowreal.net/Test: 9 http://lowreal.net/Test: 10 http://lowreal.net/Test: 11 http://lowreal.net/Test: 12 http://lowreal.net/Test: 13 http://lowreal.net/Test: 14 http://lowreal.net/Test: 15 http://lowreal.net/Test: 16 http://lowreal.net/Test: 17 http://lowreal.net/Test: 18 http://lowreal.net/Test: 19 http://lowreal.net/Test: 20 http://lowreal.net/Test: 21 http://lowreal.net/Test: 22 http://lowreal.net/Test: 23 http://lowreal.net/Test: 24 http://lowreal.net/Test: 25 http://lowreal.net/Test: 26 http://lowreal.net/Test: 27 http://lowreal.net/Test: 28 http://lowreal.net/Test: 29 http://lowreal.net/Test: 30 http://lowreal.net/Test: 31 http://lowreal.net/Test: 32 http://lowreal.net/Test: 33 http://lowreal.net/Test: 34 http://lowreal.net/Test: 35 http://lowreal.net/Test: 36 http://lowreal.net/Test: 37 http://lowreal.net/Test: 38 http://lowreal.net/Test: 39 http://lowreal.net/Test: Devided: 109msec. http://lowreal.net/Test: 40 http://lowreal.net/Test: 41 http://lowreal.net/Test: 42 http://lowreal.net/Test: 43 http://lowreal.net/Test: 44 http://lowreal.net/Test: 45 http://lowreal.net/Test: 46 http://lowreal.net/Test: 47 http://lowreal.net/Test: Devided: 116msec. http://lowreal.net/Test: 48 http://lowreal.net/Test: 49 http://lowreal.net/Test: 50 http://lowreal.net/Test: 51 http://lowreal.net/Test: 52 http://lowreal.net/Test: Devided: 109msec. http://lowreal.net/Test: 53 http://lowreal.net/Test: 54 http://lowreal.net/Test: 55 http://lowreal.net/Test: 56 http://lowreal.net/Test: Devided: 113msec. http://lowreal.net/Test: 57 http://lowreal.net/Test: 58 http://lowreal.net/Test: 59 http://lowreal.net/Test: Devided: 103msec. http://lowreal.net/Test: 60 http://lowreal.net/Test: 61 http://lowreal.net/Test: 62 http://lowreal.net/Test: Devided: 119msec. http://lowreal.net/Test: 63 http://lowreal.net/Test: 64 http://lowreal.net/Test: 65 http://lowreal.net/Test: Devided: 137msec. http://lowreal.net/Test: 66 http://lowreal.net/Test: 67 http://lowreal.net/Test: Devided: 103msec. http://lowreal.net/Test: 68 http://lowreal.net/Test: 69 http://lowreal.net/Test: Devided: 112msec. http://lowreal.net/Test: 70 http://lowreal.net/Test: 71 http://lowreal.net/Test: Devided: 122msec. http://lowreal.net/Test: 72 http://lowreal.net/Test: 73 http://lowreal.net/Test: Devided: 133msec. http://lowreal.net/Test: 74 http://lowreal.net/Test: 75 http://lowreal.net/Test: Devided: 144msec. http://lowreal.net/Test: 76 http://lowreal.net/Test: 77 http://lowreal.net/Test: Devided: 158msec. http://lowreal.net/Test: 78 http://lowreal.net/Test: 79 http://lowreal.net/Test: Devided: 168msec. http://lowreal.net/Test: 80 http://lowreal.net/Test: 81 http://lowreal.net/Test: Devided: 182msec. http://lowreal.net/Test: 82 http://lowreal.net/Test: 83 http://lowreal.net/Test: Devided: 194msec. http://lowreal.net/Test: 84 http://lowreal.net/Test: Devided: 103msec. http://lowreal.net/Test: 85 http://lowreal.net/Test: Devided: 106msec. http://lowreal.net/Test: 86 http://lowreal.net/Test: Devided: 110msec. http://lowreal.net/Test: 87 http://lowreal.net/Test: Devided: 114msec. http://lowreal.net/Test: 88 http://lowreal.net/Test: Devided: 118msec. http://lowreal.net/Test: 89 http://lowreal.net/Test: Devided: 122msec. http://lowreal.net/Test: 90 http://lowreal.net/Test: Devided: 126msec. http://lowreal.net/Test: 91 http://lowreal.net/Test: Devided: 131msec. http://lowreal.net/Test: 92 http://lowreal.net/Test: Devided: 135msec. http://lowreal.net/Test: 93 http://lowreal.net/Test: Devided: 140msec. http://lowreal.net/Test: 94 http://lowreal.net/Test: Devided: 144msec. http://lowreal.net/Test: 95 http://lowreal.net/Test: Devided: 148msec. http://lowreal.net/Test: 96 http://lowreal.net/Test: Devided: 153msec. http://lowreal.net/Test: 97 http://lowreal.net/Test: Devided: 158msec. http://lowreal.net/Test: 98 http://lowreal.net/Test: Devided: 166msec. http://lowreal.net/Test: 99 http://lowreal.net/Test: Devided: 171msec. http://lowreal.net/Test: 100 http://lowreal.net/Test: End
実際つかうならハードコードされてるところをましにしたりしないといけないかな。