Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions Ch4_AdvancedPromises/deferred-promise.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,22 @@ image::img/deferred-and-promise.png[DeferredとPromise]
DeferredがPromiseを内蔵しているような関係になっていることが分かります。

[NOTE]
jQuery.Deferredの構造を簡略化したものです。もちろんPromiseを持たないDeferredの実装もあります
jQuery.Deferredの構造を簡略化したものです。Promiseを使わないDeferredの実装もあります

図だけだと分かりにくいので、実際にPromiseを使ってDeferredを実装してみましょう。
図だけだと分かりにくいので、実際にPromiseを使ってDeferredクラスを実装してみましょう。

[NOTE]
====
ECMAScript 2015ではクラスを定義する `class` 構文が導入されています。
`class` 構文を使ったクラス定義については、次のページを参照してください。

- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes[クラス - JavaScript | MDN]
- https://jsprimer.net/basic/class/[クラス · JavaScript Primer #jsprimer]
====

=== Deferred top on Promise

Promiseの上にDeferredを実装した例です
Promiseの上にDeferredクラスを実装した例です

[source,javascript]
[[deferred.js]]
Expand Down
31 changes: 20 additions & 11 deletions Ch4_AdvancedPromises/src/deferred/deferred.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
"use strict";
function Deferred() {
this.promise = new Promise((resolve, reject) => {
this._resolve = resolve;
this._reject = reject;
});

class Deferred {
constructor() {
this.promise = new Promise((resolve, reject) => {
// Arrow Functionを利用しているため、`this`がDeferredのインスタンスを参照する
this._resolve = resolve;
this._reject = reject;
});
}

// Deferred#resolveメソッドは、`value`でPromiseインスタンスをresolveする
resolve(value) {
this._resolve(value);
}

// Deferred#rejectメソッドは、`reason`でPromiseインスタンスをrejectする
reject(reason) {
this._reject(reason);
}
}
Deferred.prototype.resolve = function(value) {
this._resolve(value);
};
Deferred.prototype.reject = function(reason) {
this._reject(reason);
};

module.exports.Deferred = Deferred;