AngularJS には $qっていう promise の枠組みがあるので、使っておくといいこと (ビューが自動的に更新されるだけだけど) がある。フレームワーク組込みの仕組みがあるのに別途 Deferred の仕組み、しかも thenable(笑) じゃない(笑) JSDeferred を読むのもバカにされると思うので、以下のように JSDeferred から Angular $q へ置き換える方法を記す。

基本

JSDeferred における global な next() 関数を $q.when().then() に置き換え、Deferred#next を then() に置き換えればだいたい動く

next(function () {
    alert(1);
    return next(function () {
        alert(2);
    }).
    next(function () {
        alert(3);
    });
}).
next(function () {
    alert(4);
});

こういうのを、こう

$q.when().then(function () {
    alert(1);
    return $q.when().then(function () {
        alert(2);
    }).
    then(function () {
        alert(3);
    });
}).
then(function () {
    alert(4);
});

parallel() は?

$q.all() を使え

loop() は?

頑張って書く。いろいろやりかたはあると思うけど、例えばこう

$q.when().then(function () {
	var list = [1, 2, 3], sum = 0;
	return $q.when().then(function loop () {
		if (list.length) {
			return $q.when(list.shift()).then(function(item) {
				console.log('item', item);
				sum += item;
			}).then(loop);
		} else {
			return sum;
		}
	});
}).
then(function (result) {
	console.log(result);
});

wait() は?

setiTimeout で頑張って書く

  1. トップ
  2. tech
  3. JSDeferred -> Angular $q 置き換え方法