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

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

Первый, кажется, приходит с поддержкой родных Обещаний, второй, кажется, нет.

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

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

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

3 ответа

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

typeof global.Promise === 'function'

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

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


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

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

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

Promise.resolve() instanceof Promise

Судя по комментариям к этому другому ответу, это только возвращает истину для обещаний ES6.

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

Ну, вы можете использовать пакет, который использует нативные обещания, если они доступны, и если они не доступны, он их скрывает.

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

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

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

Другие вопросы по тегам