Как проверить, является ли объект Promise в JavaScript?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Определить, является ли объект промисом, можно по присутствию метода then, который является характерной чертой промиса, а также с помощью конструкции instanceof:

JS
Скопировать код
let isPromise = obj instanceof Promise || Boolean(obj && typeof obj.then === 'function'); // Обещание выполнено! 😉

Такой подход учитывает одновременно структурные и наследственные свойства объекта!

Кинга Идем в IT: пошаговый план для смены профессии

Надёжная проверка с помощью опционального чейнинга

Опциональный чейнинг помогает предотвратить ошибки, связанные с null или undefined и с этой помощью можно улучшить надёжность проверки:

JS
Скопировать код
let isPromise = obj instanceof Promise || typeof obj?.then === 'function'; // Надёжность под контролем! 🚢

Добавление опционального чейнинга к проверке можно сравнить с установкой дополнительных колёс для детского велосипеда — они не позволят упасть! 🚴‍♀️

Нестандартные промисы: "тенэйблы"

Столкнувшись с нестандартными промисами или теми, которые реализованы через полифиллы, обратите внимание на объекты, имеющие метод then — "тенэйблы":

JS
Скопировать код
let isThenable = obj != null && typeof obj === 'object' && typeof obj.then === 'function'; // Если это крякает как утка...

Этот приём позволяет опознать любые объекты, имеющие метод then, что особо ценно при работе со стандартом Promises/A+!

Осторожно с Promise.resolve

Воспользовавшись Promise.resolve, важно помнить:

  • При передаче объекта-промиса в Promise.resolve не возвращается исходный объект, создаётся новый промис.
  • Когда речь идёт о промисах, созданных при помощи конструктора, Promise.resolve может заменить их на другой экземпляр.

Будьте внимательны!

Визуализация

Рассмотрим задачу определения, является ли объект промисом, на практике:

Markdown
Скопировать код
Объект для проверки: {}  | Это промис? 🧐

Применим проверку метода .then():

JS
Скопировать код
const isPromise = (obj) => obj instanceof Promise || (Boolean(obj) && typeof obj.then === 'function'); // Детективный режим: ВКЛ!🕵️‍♀️

Активируем Детектор промисов и посмотрим на результаты:

Markdown
Скопировать код
| Входящее значение     | isPromise(вход) | Визуал     |
| --------------------- | ---------------- | ---------- |
| { then: function(){} }| ✅                | 🚦 (Проход)|
| new Promise(...)      | ✅                | 🚦 (Проход)|
| { catch: function(){} }| ❌               | 🚫 (Стоп)  |
| "Я не промис"         | ❌               | 🚫 (Стоп)  |

Зелёный свет означает корректность, красный свет — время остановиться и проверить!

Запутанные ситуации и советы разработчика

  • instanceof: Может быть ненадёжным при работе с промисами из так называемых «параллельных вселенных» (например, из iframe).
  • Проскальзывающие контексты: Промисы из другого окна или фрейма могут не проходить проверку из-за использования другого конструктора Promise.
  • Разнообразие библиотек: Промисы из сторонних библиотек также могут не проходить стандартные проверки, так как они следуют собственными правилам!

Преимущества алгоритмической проверки

  • Универсальность: Позволяет объединить разные реализации промисов.
  • Стандартизация: Следует общим принципам работы с промисами вне зависимости от их внутренней структуры.

Практическое применение для разработчиков

Старайтесь организовывать код так, чтобы он мог корректно работать с промисами из любых источников. Это особенно важно при создании библиотек или решений для различных JavaScript-сред.

Полезные материалы

  1. Promise – JavaScript | MDN — подробная информация о JavaScript-промисах.
  2. ECMAScript 2015 Language Specification – ECMA-262 6th Edition — официальная спецификация, раскрывающая детали промисов.
  3. How to check if an object is a Promise? – Stack Overflow — обсуждения и примеры на Stack Overflow.
  4. Promises/A+ — сайт, подробно описывающий поведение промисов.
  5. GitHub – then/is-promise: Test whether an object looks like a promises-a+ promise — библиотека на GitHub для проверки промисов.
  6. Promise — основы работы с промисами в JavaScript.
  7. JavaScript Promises — статья о различных способах определения промисов в JavaScript.