藪下@2課のガジェオタです。
Gecko触って遊んでて気づいたんですが、Geckoで使ってるPromiseとcontentプロセスで使っているPromiseは別物みたいです。
Promise – MDN
https://developer.mozilla.org/ja/docs/Core_JavaScript_1.5_Reference/Global_Objects/Promise
ここを見るとcatch使えますね。実際適当なHTMLとJSこさえたら使えました。
でもGeckoいじってAPI作ってテスト書いてたらcatchは関数ちゃうでと怒られる。なんでだと思ったらgecko/toolkit/modules/Promise.jsmにcatchがいなかったんですね。ちなみにmasterのHEADだと怒られないです。遊んでた環境が古くてまだ実装されてなかったみたいです。
でまあcatchが実装されてるとかされてないとかは割とどうでもよくて、Geckoでは実装されてないものがコンテンツにぶら下がってる方にはあったので別物だったのかーとなった次第です。
ちなみにGecko側のにはPromise.defer()があるけどコンテンツのにはなかったりもしました。
ざっくり見た感じGeckoでよく
let Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise;
されてるものはgecko/toolkit/modules/Promise.jsmで実装されていて、コンテンツ側で使うものはgecko/dom/promiseにいるみたいです。
まだ整理されてないだけかもしれませんが、こういうこともあるんですね。
gecko/toolkit/modules/Promise.jsm は、JSコードモジュール形式のユーティリティライブラリで、XUL Toolkit向けに導入されたものです。JavaScriptによって再実装されたものなので、polyfillとして認識するのが一番適切かと思います。
対して gecko/dom/promise は、ES6/DOM Promiseの実装です(ES6 PromiseであればSpiderMonkeyが実装する対象であるため、厳密にはDOM Promiseとしての実装)。
過渡期っていう指摘は正解で、Promise.jsmは、FirefoxのUI開発やToolkitの開発にあたり導入されたものですが、その後、ES6/DOM Promiseの標準化・実装が行われたため、Promise.jsmの必要性は薄れてきています。
“mozilla.dev.platform – Promise.jsm and the predefined Promise object” ( https://groups.google.com/d/topic/mozilla.dev.platform/nlg1-z_CChk/discussion ) での議論のように、Promise.jsmの使用は推奨される物ではないとされています(ES6 Promiseとの間で微妙にAPIの挙動が異なるためにfoot-gunとなりうると論じられています)。
また、Gecko 31以降は、JSコードモジュールおよびWorker内でもES6/DOM Promiseの利用が可能になるため、原則としてはそちらを利用すべきだろうと思います( 参照: https://bugzilla.mozilla.org/show_bug.cgi?id=988122 )。
しかしながら、ES6/DOM Promiseではデバッグ関連の機能(下記リンク)が完全とは言いがたい面もあるため、Promise.jsmを用いる必要のあるケースも存在しますし、Gecko 30以前ではWindowないしChromeWindowに触れないことにはDOM Promiseを使用できないので、Promise.jsmを使用する方が良い・せざるをえないケースが存在するのも現状です。
– https://bugzilla.mozilla.org/show_bug.cgi?id=966472
– https://bugzilla.mozilla.org/show_bug.cgi?id=966471
おー、さすがさねゆき師匠。参考になります!
とりあえず今すぐやりたいchrome側のテストとかではPromise.jsmで書くのが手間がない感じですね。
content側とか今後はdom Promiseにするよう意識する感じですかね。
V8のPromiseはES6PromiseですがPromise.defer()があります
V8のPromiseのPromise.defer()は、試験実装初期の名残と思われます。
現在の最新のDraftである Ecma-262 Edition 6 Draft Rev 25 では、Promise.defer()というプロパティは存在していませんし、V8側にも削除するタスクが立っていますので、将来的には使用できなくなるでしょう。
https://code.google.com/p/v8/issues/detail?id=3237