指定されたオブジェクトがES6 Promiseであるかどうかを確認するには、次の述語を使用できます。
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Call
INGのtoString
直接Object.prototype
戻るネイティブ文字列表現で指定されたオブジェクト・タイプの"[object Promise]"
我々の場合です。これにより、指定されたオブジェクトが
- 次のような誤検知をバイパスします。
- 同じコンストラクタ名( "Promise")を持つ自己定義オブジェクトタイプ。
toString
指定されたオブジェクトの自己記述メソッド。
- またはとは対照的に
instanceof
、複数の環境コンテキスト(iframeなど)で機能しisPrototypeOf
ます。
ただし、によってタグが変更されている特定のホストオブジェクトは、を返すことができます。これは、プロジェクトによっては、意図した結果である場合とそうでない場合があります(カスタムのPromise実装がある場合など)。Symbol.toStringTag
"[object Promise]"
オブジェクトがネイティブES6 Promiseからのものかどうかを確認するには、次を使用できます。
function isNativePromise(p) {
return p && typeof p.constructor === "function"
&& Function.prototype.toString.call(p.constructor).replace(/\(.*\)/, "()")
=== Function.prototype.toString.call(/*native object*/Function)
.replace("Function", "Promise") // replacing Identifier
.replace(/\(.*\)/, "()"); // removing possible FormalParameterList
}
これと仕様のこのセクションによれば、関数の文字列表現は次のようになります。
「関数識別子(FormalParameterList opt){ FunctionBody }」
上記に応じて処理されます。FunctionBodyがある[native code]
すべての主要なブラウザで。
MDN: Function.prototype.toString
これは、複数の環境コンテキストでも機能します。
.then
メソッドをチェックすることができますが、それはあなたが持っているものが確実に約束であることをあなたに教えないでしょう。その時点で知っているのは、Promise などの.then
メソッドを公開するものがあるということだけです。