もはや Promise がスタンダードに入り、モダンな実行環境ではポリフィルすら必要なく使えるケースが増えましたね。

かくいう自分も JSDeferred は使っておらず完全に Promise 依存に切替えております。外部ライブラリ依存なんてないほうがいい!!

JSDeferred と Promise の違い

機能的にはほぼ変わりがないので機械的に置き換えできますが、Promise は1度だけしか resolve できない点だけ違うので注意が必要。JSDeferred は値を保持しませんが、Promise は resolve した値を保持し、その後の then ではその値が返ってきます。

var resolver;
var promise = new Promise(function (resolve, reject) {
	resolver = resolve;
});

promise.then(function (r) {
	console.log(r); //=> foo
});

resolver('foo');

promise.then(function (r) {
	console.log(r); //=> foo
});

resolver('bar'); // nothing happened (invalid operation)

JSDeferred は遅延された (Deferred) な処理を表現していますが、Promise は未来の値に関する約束を表現している点で違いがでます (Promise は値なので継続(手続)のように扱うことはできない)

基本

JSDeferred() のグローバルな next() を引数なし Promise.resolve() に置き換えます。あとの next() は全部 then() に置き換えます。

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

これを

Promise.resolve().then(function () {
    alert(1);
    return Promise.resolve().then(function () {
        alert(2);
    }).
    then(function () {
        alert(3);
    });
}).
then(function () {
    alert(4);
});

こうじゃ

parallel() は?

Promise.all(list) を使う

earlier() は?

Promise.race(list)

wait() は?

new Promise( (resolve) => {
    setTimeout(resolve, 100);
});
  1. トップ
  2. tech
  3. JSDeferred -> Promise 置き換え方法
▲ この日のエントリ