2016-02-27 2 views
1

Например, у меня есть довольно текущие версии официального Joyent NodeJS, установленные, конечно, с движком JavaScript Google V8, а также JXcore с движком JavaScript Mozilla SpiderMonkey.Как код, который может запускаться под NodeJS, JXcore и т. Д., Определяет, работает ли он в среде, поддерживающей собственные ES6-обещания?

Бывший, похоже, поставляется с поддержкой местных обещаний, последнее, похоже, не так.

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

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

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

ответ

1

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

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

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

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

1

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

Promise.resolve() instanceof Promise 

comments to this other answer С, кажется, возвращает только верно для собственных ES6 обещаний.

Это решение скорее всего отклонит полипол.

2

Чтобы получить ответ на свой вопрос, используйте это, чтобы обнаружить наличие ES6 обещает:

typeof global.Promise === 'function' 

В качестве альтернативы использовать lightweight ES6 promise polyfill вместо того, чтобы полагаться на большей частично несовместимой библиотеки.

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


более длинный, но trustworthier альтернативой является то, как то, что это package uses:

global.Promise && Object.prototype.toString.call(global.Promise.resolve()) === '[object Promise]') 
Смежные вопросы