Как проверить, является ли объект Promise в JavaScript?
Быстрый ответ
Определить, является ли объект промисом, можно по присутствию метода then, который является характерной чертой промиса, а также с помощью конструкции instanceof:
let isPromise = obj instanceof Promise || Boolean(obj && typeof obj.then === 'function'); // Обещание выполнено! 😉
Такой подход учитывает одновременно структурные и наследственные свойства объекта!
[AsideBanner]
Надёжная проверка с помощью опционального чейнинга
Опциональный чейнинг помогает предотвратить ошибки, связанные с null
или undefined
и с этой помощью можно улучшить надёжность проверки:
let isPromise = obj instanceof Promise || typeof obj?.then === 'function'; // Надёжность под контролем! 🚢
Добавление опционального чейнинга к проверке можно сравнить с установкой дополнительных колёс для детского велосипеда — они не позволят упасть! 🚴♀️
Нестандартные промисы: "тенэйблы"
Столкнувшись с нестандартными промисами или теми, которые реализованы через полифиллы, обратите внимание на объекты, имеющие метод then
— "тенэйблы":
let isThenable = obj != null && typeof obj === 'object' && typeof obj.then === 'function'; // Если это крякает как утка...
Этот приём позволяет опознать любые объекты, имеющие метод then
, что особо ценно при работе со стандартом Promises/A+!
Осторожно с Promise.resolve
Воспользовавшись Promise.resolve
, важно помнить:
- При передаче объекта-промиса в
Promise.resolve
не возвращается исходный объект, создаётся новый промис. - Когда речь идёт о промисах, созданных при помощи конструктора,
Promise.resolve
может заменить их на другой экземпляр.
Будьте внимательны!
Визуализация
Рассмотрим задачу определения, является ли объект промисом, на практике:
Объект для проверки: {} | Это промис? 🧐
Применим проверку метода .then()
:
const isPromise = (obj) => obj instanceof Promise || (Boolean(obj) && typeof obj.then === 'function'); // Детективный режим: ВКЛ!🕵️♀️
Активируем Детектор промисов и посмотрим на результаты:
| Входящее значение | isPromise(вход) | Визуал |
| --------------------- | ---------------- | ---------- |
| { then: function(){} }| ✅ | 🚦 (Проход)|
| new Promise(...) | ✅ | 🚦 (Проход)|
| { catch: function(){} }| ❌ | 🚫 (Стоп) |
| "Я не промис" | ❌ | 🚫 (Стоп) |
Зелёный свет означает корректность, красный свет — время остановиться и проверить!
Запутанные ситуации и советы разработчика
- instanceof: Может быть ненадёжным при работе с промисами из так называемых «параллельных вселенных» (например, из iframe).
- Проскальзывающие контексты: Промисы из другого окна или фрейма могут не проходить проверку из-за использования другого конструктора
Promise
. - Разнообразие библиотек: Промисы из сторонних библиотек также могут не проходить стандартные проверки, так как они следуют собственными правилам!
Преимущества алгоритмической проверки
- Универсальность: Позволяет объединить разные реализации промисов.
- Стандартизация: Следует общим принципам работы с промисами вне зависимости от их внутренней структуры.
Практическое применение для разработчиков
Старайтесь организовывать код так, чтобы он мог корректно работать с промисами из любых источников. Это особенно важно при создании библиотек или решений для различных JavaScript-сред.
Полезные материалы
- Promise – JavaScript | MDN — подробная информация о JavaScript-промисах.
- ECMAScript 2015 Language Specification – ECMA-262 6th Edition — официальная спецификация, раскрывающая детали промисов.
- How to check if an object is a Promise? – Stack Overflow — обсуждения и примеры на Stack Overflow.
- Promises/A+ — сайт, подробно описывающий поведение промисов.
- GitHub – then/is-promise: Test whether an object looks like a promises-a+ promise — библиотека на GitHub для проверки промисов.
- Promise — основы работы с промисами в JavaScript.
- JavaScript Promises — статья о различных способах определения промисов в JavaScript.