Как код, который может работать под NodeJS, JXcore и т. д., может определить, работает ли он в среде, которая поддерживает собственные промисы ES6?

Например, у меня есть довольно свежие версии официального Joyent NodeJS, установленного, конечно же, с движком JavaScript Google V8, а также JXcore с движком JavaScript Mozilla SpiderMonkey.

Первый, похоже, имеет встроенную поддержку Promises, второй, похоже, нет.

(И, конечно же, это не единственные две возможные среды, в которых может работать код nodeJS.

Как мой код может проверить свою среду, чтобы увидеть, может ли он использовать нативные промисы или нет?

Ничего страшного, если в этом случае он обнаружит правильный полифилл как «родной». Но он не должен обнаруживать что-то вроде Q как собственные промисы. (Или дайте мне знать, если я ошибаюсь.)


person hippietrail    schedule 27.02.2016    source источник


Ответы (3)


Чтобы напрямую ответить на ваш вопрос, используйте это для определения доступности промисов ES6:

typeof global.Promise === 'function'

В качестве альтернативы используйте облегченный полифилл обещаний ES6 вместо того, чтобы полагаться на более крупную частично несовместимую библиотеку.

С полифиллом вы можете просто использовать обычный Promise API и просто удалить require, когда он больше не нужен — рефакторинг не требуется.


Более длинная, но более надежная альтернатива — это что-то вроде этого пакета использует:

  global.Promise && Object.prototype.toString.call(global.Promise.resolve()) === '[object Promise]')
person fregante    schedule 28.02.2016

Что ж, вы можете использовать пакет, который использует встроенные промисы, если они доступны и если они Это не прокладки их.

В качестве альтернативы, поскольку это сервер, вам может быть лучше использовать совместимую пользовательскую библиотеку, пока все ваши среды не будут поддерживать нативную обещания.

Обратите внимание, что jxcore не поддерживает некоторые стандартные функции обещаний NodeJS, такие как unhandledRejection, которые поддерживают полифилы и библиотеки пользовательского пространства.

Что касается обнаружения нативных промисов — это может быть сложно в разных средах. Технически вы можете проверить, есть ли глобальный объект Promise в качестве первой строки кода в вашей программе, но это беспорядочно по сравнению с альтернативой использования совместимой более быстрой пользовательской библиотеки.

person Benjamin Gruenbaum    schedule 27.02.2016

Это может сделать это:

Promise.resolve() instanceof Promise

Из комментариев к этому другому ответу кажется, что это возвращает true только для собственных обещаний ES6.

Однако это решение, скорее всего, отклонит полифилл.

person jib    schedule 27.02.2016