Щоб побачити, чи є даний об'єкт обіцянкою ES6 , ми можемо скористатися цим присудком:
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Call
ing toString
безпосередньо з Object.prototype
повертає нативне рядкове подання даного типу об'єкта, яке є "[object Promise]"
в нашому випадку. Це забезпечує, що даний об'єкт
- Обходить помилкові позитиви, такі як ..:
- Самовизначений тип об'єкта з тим же ім'ям конструктора ("Обіцяти").
- Самописний
toString
метод даного об’єкта.
- Працює в декількох середовищах (наприклад, рамки кадрів) на відміну від
instanceof
або isPrototypeOf
.
Однак будь-який конкретний хост-об’єкт , у якого його тег змінено через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
}
Відповідно до цього та цього розділу специфікації, рядкове представлення функції має бути:
" Ідентифікатор функції ( opt. FormalParameterList opt ) { FunctionBody }"
що обробляється відповідно вище. FunctionBody є[native code]
у всіх основних браузерах.
MDN: Function.prototype.toString
Це працює також у різних середовищах.
.then
метод, але це не скаже вам, що у вас є Обіцянка остаточно. Все, що ви знаєте на той момент, - це те, що у вас є щось, що викриває такий.then
метод, як Обіцянка.