From 9f578ab22218483a0aad2a8b9974ae1ba6320a4d Mon Sep 17 00:00:00 2001 From: azu Date: Mon, 2 Jun 2014 08:26:21 +0900 Subject: [PATCH 1/2] =?UTF-8?q?write(what-is-promise):=20Promise=E3=81=A8?= =?UTF-8?q?=E4=BD=95=E3=81=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit コールバックとの違いは非同期処理に対する統一的なインターフェース --- Ch1_WhatsPromises/what-is-promise.adoc | 62 ++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/Ch1_WhatsPromises/what-is-promise.adoc b/Ch1_WhatsPromises/what-is-promise.adoc index 32c229aa8..fd671a3c5 100644 --- a/Ch1_WhatsPromises/what-is-promise.adoc +++ b/Ch1_WhatsPromises/what-is-promise.adoc @@ -1,7 +1,61 @@ [[what-is-promise]] == What Is Promise -- [ ] プロミスとはどういう概念なのかー -- [ ] Promisesはどうやってできた? <= これはコラムとかで良さそう -- [ ] 何を目的にしてるー -- [ ] どういう時に利用すると便利なのー \ No newline at end of file +まずPromiseとはそもそも何でしょう? + +Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みを提供するものの事を言います。 +詳しくはこれから学んでいくとして、PromiseはJavaScriptで発見された概念ではありません。 + +最初に発見されたのは http://erights.org/elib/distrib/pipeline.html[E言語]におけるもので、 +並列/並行処理におけるプログラミング言語のデザインの一種です。 + +JavaScriptにおける非同期処理といえば、コールバックを利用する場合が多いと思います。 + +[source,js] +.コールバックを使った非同期処理の一例 +---- +getAsync("fileA.txt", function(error, result){// <1> + if(error){// 取得失敗時の処理 + throw error; + } + // 取得成功の処理 +}); +---- +<1> コールバック関数の引数には(エラーオブジェクト, 結果)が入る + +Node.js等JavaScriptでのコールバック関数の第一引数には`Error`オブジェクトを渡すという +ルールを用いるケースがあります。 + +このようにコールバックでの非同期処理もルールが統一されていた場合、 +コールバック関数には何を書けばいいかが明確になります。 +しかし、これはあくまでコーディングルールであるので、異なる書き方をしても決して間違いではありません。 + +Promiseでは、このような非同期に対するオブジェクトとルールを仕様化して、 +Promiseを使った場合は常に統一的なインターフェースで書けるようしています。 + +[source,js] +.Promiseを使った非同期処理の一例 +---- +var promise = getAsyncPromise("fileA.txt"); // <1> +promise.then(function(result){ + // 取得成功の処理 +}).catch(function(error){ + // 取得失敗時の処理 +}); +---- +<1> promiseオブジェクトを返す + +非同期処理を抽象化したpromiseオブジェクトというものを用意し、 +そのpromiseオブジェクトに対して成功時の処理と失敗時の処理の関数を登録するようにして使います。 + +コールバック関数と比べると何か違うのかを簡単に見ると、 +非同期処理の書き方がpromiseオブジェクトのインターフェースに沿った書き方に限定されます。 + +つまり、promiseオブジェクトに用意されてるメソッド(ここでは`then`や`catch`)以外は使えないため、 +コールバックのように引数に何を入れるかが自由に決められるわけではなく、一定のやり方に統一されます。 + +この、Promiseという統一されたインターフェースがあることで、 +そのインターフェースにおける様々な非同期処理のパターンが形成することが出来ます。 + +つまり、Promiseを学ぶ事で複雑な非同期処理等を上手くパターン化できるというのが、 +Promiseの役割であり、Promiseを使う理由の一つであるといえるでしょう。 \ No newline at end of file From 26ec565203d6d32e33b03b55f6cc0ee87c7bf562 Mon Sep 17 00:00:00 2001 From: azu Date: Mon, 2 Jun 2014 09:09:29 +0900 Subject: [PATCH 2/2] =?UTF-8?q?write(what-is-promise):=20=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E3=81=AE=E7=B0=A1=E7=95=A5=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ch1_WhatsPromises/what-is-promise.adoc | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Ch1_WhatsPromises/what-is-promise.adoc b/Ch1_WhatsPromises/what-is-promise.adoc index fd671a3c5..cdb4a6945 100644 --- a/Ch1_WhatsPromises/what-is-promise.adoc +++ b/Ch1_WhatsPromises/what-is-promise.adoc @@ -3,13 +3,15 @@ まずPromiseとはそもそも何でしょう? -Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みを提供するものの事を言います。 +Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みの事をいいます。 詳しくはこれから学んでいくとして、PromiseはJavaScriptで発見された概念ではありません。 最初に発見されたのは http://erights.org/elib/distrib/pipeline.html[E言語]におけるもので、 並列/並行処理におけるプログラミング言語のデザインの一種です。 -JavaScriptにおける非同期処理といえば、コールバックを利用する場合が多いと思います。 +このデザインをJavaScriptに持ってきたものが、この書籍で学ぶJavaScript Promiseです。 + +一方、JavaScriptにおける非同期処理といえば、コールバックを利用する場合が多いと思います。 [source,js] .コールバックを使った非同期処理の一例 @@ -23,15 +25,14 @@ getAsync("fileA.txt", function(error, result){// <1> ---- <1> コールバック関数の引数には(エラーオブジェクト, 結果)が入る -Node.js等JavaScriptでのコールバック関数の第一引数には`Error`オブジェクトを渡すという -ルールを用いるケースがあります。 +Node.js等JavaScriptでのコールバック関数の第一引数には`Error`オブジェクトを渡すというルールを用いるケースがあります。 このようにコールバックでの非同期処理もルールが統一されていた場合、 コールバック関数には何を書けばいいかが明確になります。 -しかし、これはあくまでコーディングルールであるので、異なる書き方をしても決して間違いではありません。 +しかし、これはあくまでコーディングルールであるため、異なる書き方をしても決して間違いではありません。 Promiseでは、このような非同期に対するオブジェクトとルールを仕様化して、 -Promiseを使った場合は常に統一的なインターフェースで書けるようしています。 +統一的なインターフェースで書くようになっており、それ以外の書き方は出来ないようになっています。 [source,js] .Promiseを使った非同期処理の一例 @@ -55,7 +56,9 @@ promise.then(function(result){ コールバックのように引数に何を入れるかが自由に決められるわけではなく、一定のやり方に統一されます。 この、Promiseという統一されたインターフェースがあることで、 -そのインターフェースにおける様々な非同期処理のパターンが形成することが出来ます。 +そのインターフェースにおける様々な非同期処理のパターンを形成することが出来ます。 + +つまり、複雑な非同期処理等を上手くパターン化できるというのがPromiseの役割であり、 +Promiseを使う理由の一つであるといえるでしょう。 -つまり、Promiseを学ぶ事で複雑な非同期処理等を上手くパターン化できるというのが、 -Promiseの役割であり、Promiseを使う理由の一つであるといえるでしょう。 \ No newline at end of file +それでは、実際にJavaScriptでのPromiseについて学んでいきましょう。 \ No newline at end of file