Promiseの仕様?

JavaScriptにおけるPromiseの仕様といえば、次期ECMAScriptのECMAScript Language Specification ECMA-262 6th Edition – DRAFTで策定されています。

このES6 Promisesについて詳しくはJavaScript Promiseの本という無料の電子書籍で書いたのでこちらを参照して下さい。

以前、Promiseについて紹介した時に以下のように書いてました。

また、今後ブラウザに実装されるAPIとしてService WorkersやStreams API等、Promiseをベースしたものも出てきています。 -- JavaScript Promiseの本を書きました | Web Scratch

実際にどれくらいの仕様がPromiseを参照してるかを調べてみました。

Promiseを参照する仕様

以下のリポジトリにまとめてあります。(今後更新するかもしれないので、最新はリポジトリの方を参照)

実際に見ていくと以下のような仕様がPromiseを参照しています。

* 時期によってDOM PromiseとES6 Promiseが混ざっています(今回は両方の一覧を出しています)


Fetch Standard

http://fetch.spec.whatwg.org/

http://www.w3.org/html/wg/drafts/html/master/webappapis.html#navigator

Web API Design Cookbook

http://www.w3.org/TR/api-design/

Manifest for web apps and bookmarks

http://www.w3.org/TR/appmanifest/

Battery Status API

http://www.w3.org/TR/battery-status/

CSS Font Loading Module Level 3

http://www.w3.org/TR/css-font-loading-3/

CSV on the Web: Use Cases and Requirements

http://www.w3.org/TR/csvw-ucr/

Network Service Discovery

http://www.w3.org/TR/discovery-api/

Encrypted Media Extensions

http://www.w3.org/TR/encrypted-media/

JSON-LD 1.0 Processing Algorithms and API

http://www.w3.org/TR/json-ld-api/

Web NFC API

http://www.w3.org/TR/nfc/

Push API

http://www.w3.org/TR/push-api/

Quota Management API

http://www.w3.org/TR/quota-api/

Service Workers

http://www.w3.org/TR/service-workers/

Streams API

http://www.w3.org/TR/streams-api/

Web Telephony API

http://www.w3.org/TR/telephony/

WebCrypto Key Discovery

http://www.w3.org/TR/webcrypto-key-discovery/

Web Cryptography API

http://www.w3.org/TR/WebCryptoAPI/

Web MIDI API

http://www.w3.org/TR/webmidi/

HTML

http://www.whatwg.org/specs/web-apps/current-work/


上記の仕様で策定されてるAPIの多くは非同期処理でpromiseオブジェクトを返すようになっています。

例えば、CSS Font Loading Module Level 3では以下のようにフォントのロードが完了した時の処理をPromiseで書けるようになっています。

var f = new FontFace(
  "Lobster",
  "url(http://fonts.gstatic.com/s/lobster/v9/NIaFDq6p6eLpSvtV2DTNDQLUuEpTyoUstqEm5AMlJo4.woff)",
  {}
 );

f.load().then(function (loadedFace) {
  document.fonts.add(loadedFace);
  document.querySelector(".lorem").style.fontFamily = "Lobster, serif";
});

via CSS Font Loading Module Level 3を試してみた - console.blog(self);

このように、策定中の仕様も多いですが、色々な仕様がPromiseを使っています。 そのため、今後出てくるAPIを使う際にはPromiseの基本的な知識は必要になってくると思います。

どうやって調べたか

ウェブの仕様は今どこにあるのか? | Web Scratchという記事でも、色々書きましたが仕様のURLを調べるにはtobie/specrefを使うのが簡単です。

tobie/specrefからJSONで仕様の一覧(W3C,WHATWG,IETFは大体あるはず)を取得できます。 これのデータを使って仕様をまとめてダウンロードするazu/webspec-downloaderというものを書きました。

ダウンロードしたhtml等をgrepして目視でまとめました。azu/reference-promises-specにもう少し詳しく書いてあります)

tobie/specref はWeb APIとしても使えるので、 もっと色々な使い道があるかもしれません。

nfc

Web NFC APIなど最近かかれてGitHubに公開されている仕様には ReSpecというバッジが付いている事があります。 仕様の検索やチェック機能が入っていますが、これはspecrefのAPIを使って実装されています。