Skip to content

Commit

Permalink
Merge pull request #67 from azu/feature/id/12
Browse files Browse the repository at this point in the history
[Ch1] Promiseとは何か

close #12
  • Loading branch information
azu committed Jun 2, 2014
2 parents 6bb908e + 26ec565 commit cf5d345
Showing 1 changed file with 61 additions and 4 deletions.
65 changes: 61 additions & 4 deletions Ch1_WhatsPromises/what-is-promise.adoc
Original file line number Diff line number Diff line change
@@ -1,7 +1,64 @@
[[what-is-promise]]
== What Is Promise

- [ ] プロミスとはどういう概念なのかー
- [ ] Promisesはどうやってできた? <= これはコラムとかで良さそう
- [ ] 何を目的にしてるー
- [ ] どういう時に利用すると便利なのー
まずPromiseとはそもそも何でしょう?

Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みの事をいいます。
詳しくはこれから学んでいくとして、PromiseはJavaScriptで発見された概念ではありません。

最初に発見されたのは http://erights.org/elib/distrib/pipeline.html[E言語]におけるもので、
並列/並行処理におけるプログラミング言語のデザインの一種です。

このデザインをJavaScriptに持ってきたものが、この書籍で学ぶJavaScript Promiseです。

一方、JavaScriptにおける非同期処理といえば、コールバックを利用する場合が多いと思います。

[source,js]
.コールバックを使った非同期処理の一例
----
getAsync("fileA.txt", function(error, result){// <1>
if(error){// 取得失敗時の処理
throw error;
}
// 取得成功の処理
});
----
<1> コールバック関数の引数には(エラーオブジェクト, 結果)が入る

Node.js等JavaScriptでのコールバック関数の第一引数には`Error`オブジェクトを渡すというルールを用いるケースがあります。

このようにコールバックでの非同期処理もルールが統一されていた場合、
コールバック関数には何を書けばいいかが明確になります。
しかし、これはあくまでコーディングルールであるため、異なる書き方をしても決して間違いではありません。

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を使う理由の一つであるといえるでしょう。

それでは、実際にJavaScriptでのPromiseについて学んでいきましょう。

0 comments on commit cf5d345

Please sign in to comment.