[Firefox OS][Gecko]おや? Promiseって?


 藪下@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にいるみたいです。

 まだ整理されてないだけかもしれませんが、こういうこともあるんですね。

[Firefox OS][Gecko]おや? Promiseって?” への4件のコメント

  1. 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にするよう意識する感じですかね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">