もはや 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); });