Щоб побачити, чи є даний об'єкт обіцянкою ES6 , ми можемо скористатися цим присудком:
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Calling 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метод, як Обіцянка.