4つの主要ブラウザのうち、2つが実装済みで、Safariにはラグがあるだけで、今回紹介するJSCでも実装済みです
新しくPromiseを作成
syncOrAsync() の結果をそのまま resolve
Promise を成功として完了させる
syncOrAsync() が同期的な値または Promise を返す場合、その結果が .then(console.log) に渡されてコンソールに出力される
もし syncOrAsync() がエラーをスローしたり、返された Promise が拒否された場合は、.catch(console.error) によってエラーがコンソールに出力される
Promiseは即座に解決されるため、不必要な非同期処理は発生しない
このように、これといった書き方がなかったため、 `Promise.try()`が標準化される前にも、`Promise.try()`のような機能を提供するライブラリは存在していた
これらのライブラリもそうなのですが、Promise.tryが解決することは、
Promise.tryを初期に推し進めていた人の記事
まずJSエンジンの実装を見る前に、Promise.tryの仕様を見る
仕様自体はわずか7行で書かれていて非常にシンプルです
日本語訳するとこんな感じなのですが、
promiseCapabilityやNewPromiseCapability、Completionなど、使用を読む上で
見慣れない概念があると思うので、それを説明する。特にNewPromiseCapabilityが肝となる概念なのでそれに付随して他の概念も説明していく。
NewPromiseCapabilityはPromiseCapabilityRecordを生成する仕様上の関数と言える
- ※ 仕様上はnormal completionまたはthrow completionのみが関心ごととなる
- Typeがnormalなものはnormal completionと呼ばれる。normal completion以外のCompletion Recordはabrupt completionと呼ばれる。
thorow completion以外のabruptは出てこない
組み込み関数の抽象操作を表現する過程では、関数の内部的である実装のことは気にしないため、
関数の境界を越えられないbreak/continue/returnは動作せず、
仕様レベルではnormal completionまたはthrow completionのみが関心ごととなるという意味
JSCではビルトイン関数をC++で書くこともできるし、JSで書くこともできる。そして Promise.try は JS で書かれている
そんなJSで書かれたPromise.tryの実装を仕様に即して見てみましょう
使用の一番目の手順は実装には出てこないのでスキップするとして、2番目から見ていきます
`arguments`というArrayLike を args 配列に詰め直してるだけ
仕様では、Completionという概念を使ってエラーハンドリングがなされていたが、それは仕様上の概念であって、JSCのコードではJSの普通のtry-catchのエラーハンドリングとして表現されているということを補足しておく
Jordan Harband, Champion of the Promise.try proposal
具体的には後続スライドのような原因で時間がかかったとChampionのJordan Harbandは述べていた
Jordanについでに「何が今後のPromiseの新機能としてアツいの?」というのを聞けたのでそれを話す