JSDeferred -> Promise 置き換え方法
もはや 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);
}); 関連エントリー
- JSDeferred -> Angular $q 置き換え方法 AngularJS には $qっていう promise の枠組みがあるので、使っておくといいこと (ビューが自動的に更新されるだけだけど) ...
- node.js で git の blob sha1 を求める github の API とかに出てくる "sha" は git 的な sha1 で、ファイルの内容のみからとった sha1 ではない。なん...
- Angular JS でビューを伴う Service ってどう書けばいいんですか 続きをかきました。 [tech] Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directi...
- ブログシステムの HTML 生成を効率化 そろそろやることなくなったので minify などをやることにしました。 ただ、ブログシステムの出力の最後ほうでページごとに全体を mini...
- LAN 内の mDNS に応答するホストを列挙したい PTR _services._dns-sd._udp.local. A/AAAA [ソースアドレス].in-addr.arpa. をやりたい...