-
-
Notifications
You must be signed in to change notification settings - Fork 580
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #67 from azu/feature/id/12
[Ch1] Promiseとは何か close #12
- Loading branch information
Showing
1 changed file
with
61 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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について学んでいきましょう。 |