Files
react-native/Libraries/Core/polyfillPromise.js
T
Xuan Huang 0a28b34dac Conditionalize Promise Polyfill for Hermes
Summary:
On Hermes, RN can directly use the Promise from global w/o the need of polyfilling it.

PromiseRejectionTrackingOptions are extracted to its own file so it can be shared by
both codepaths and preserve the behaviors that it's only imported on dev.
Some zero-overhead type gymnastics are used to flow-type it properly.

Changelog:
[General] - made promise polyfill conditionalized on Hermes

Reviewed By: cpojer

Differential Revision: D24068716

fbshipit-source-id: 3e0b1675493908324f27cc5b7300d8cc42a03acc
2020-10-19 15:24:38 -07:00

39 lines
1.1 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict
* @format
*/
'use strict';
const {polyfillGlobal} = require('../Utilities/PolyfillFunctions');
/**
* Set up Promise. The native Promise implementation throws the following error:
* ERROR: Event loop not supported.
*
* If you don't need these polyfills, don't use InitializeCore; just directly
* require the modules you need from InitializeCore for setup.
*/
// If global.Promise is provided by Hermes, we are confident that it can provide
// all the methods needed by React Native, so we can directly use it.
if (global?.HermesInternal?.hasPromise?.()) {
const HermesPromise = global.Promise;
if (__DEV__) {
if (typeof HermesPromise !== 'function') {
console.error('HermesPromise does not exist');
}
global.HermesInternal.enablePromiseRejectionTracker(
require('../promiseRejectionTrackingOptions').default,
);
}
} else {
polyfillGlobal('Promise', () => require('../Promise'));
}