Skip to content

Instantly share code, notes, and snippets.

@shinyaohira
Last active January 4, 2016 13:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shinyaohira/8629786 to your computer and use it in GitHub Desktop.
Save shinyaohira/8629786 to your computer and use it in GitHub Desktop.

処理の順番を計算させる: CallbackとPromise

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のリスト」を「リクエストに対するプロミスのリスト」へと変換すれば良い。 全ての結果をまとめて処理したい場合は、「リクエストに対するプロミスのリスト」を「プロミスのリストを解決するプロミス」へと変換すれば良い。

命令形プログラミングでは、人間が命令シーケンスを記述するため、コンパイラやランタイムが並列実行の最適化を行うことは難しい。 関数型プログラミングでは、命令シーケンスは値の依存関係から導き出されるため、コンパイラやランタイムが並列実行の最適化をしやすい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment