Promiseは、単にCallbackベースの非同期処理を綺麗な構文で書くための方法ではない。 Promiseは、問題をより高いレベルで抽象化する方法を提供するもの。
関数型プログラミングは、あらゆるものを値として扱う。
命令型プログラミングでは、どのように処理するか(how)を命令シーケンスとして記述する。 関数型プログラミングでは、何を処理するか(what)を値の関係として記述する。howは値の依存関係から導き出される。
Callbackを引数にとる関数は、何も返さない。 何も返さない関数は、サイドエフェクトを起こすためだけに実行される。 サイドエフェクトに頼ったプログラミングは、どのように処理するか(how)を命令シーケンスとして記述する必要がある。
ある関数の出力が次の関数の入力になることで、パイプラインを構築できる。 これにより、値同士の構造的な関係を構築することができる。 Promiseも値同士の構造的な関係を構築することができる。 値同士の関係を構築すると、タイミングに依存せずに処理結果を扱うことができる。
var p1 = new Promise();
p1.then(console.log);
p1.resolve(42);
var p2 = new Promise();
p2.resolve(2013);
p2.then(console.log);
例えば、複数のWeb APIに並列アクセスする必要がある場合、「URLのリスト」を「リクエストに対するプロミスのリスト」へと変換すれば良い。 全ての結果をまとめて処理したい場合は、「リクエストに対するプロミスのリスト」を「プロミスのリストを解決するプロミス」へと変換すれば良い。
命令形プログラミングでは、人間が命令シーケンスを記述するため、コンパイラやランタイムが並列実行の最適化を行うことは難しい。 関数型プログラミングでは、命令シーケンスは値の依存関係から導き出されるため、コンパイラやランタイムが並列実行の最適化をしやすい。