/
githubmr
/
facebook-react
Обзор
Документация
Войти
/
githubmr
/
facebook-react
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
v18.3.0
packages/react/src/ReactLazy.js
184 строки
5 KB
BIKI DAS
Packages/React/src/ReactLazy ---> changing -1 to unintialized (#22421)
24 сен 2021, 20:52
Не верифицирован
24 сен 2021, 20:52
3746eaf
Код
Авторство
О чём код?
/** * 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 */ import type {Wakeable, Thenable} from 'shared/ReactTypes'; import {REACT_LAZY_TYPE} from 'shared/ReactSymbols'; const Uninitialized = -1; const Pending = 0; const Resolved = 1; const Rejected = 2; type UninitializedPayload<T> = { _status: -1, _result: () => Thenable<{default: T, ...}>, }; type PendingPayload = { _status: 0, _result: Wakeable, }; type ResolvedPayload<T> = { _status: 1, _result: {default: T}, }; type RejectedPayload = { _status: 2, _result: mixed, }; type Payload<T> = | UninitializedPayload<T> | PendingPayload | ResolvedPayload<T> | RejectedPayload; export type LazyComponent<T, P> = { $$typeof: Symbol | number, _payload: P, _init: (payload: P) => T, }; function lazyInitializer<T>(payload: Payload<T>): T { if (payload._status === Uninitialized) { const ctor = payload._result; const thenable = ctor(); // Transition to the next state. // This might throw either because it's missing or throws. If so, we treat it // as still uninitialized and try again next time. Which is the same as what // happens if the ctor or any wrappers processing the ctor throws. This might // end up fixing it if the resolution was a concurrency bug. thenable.then( moduleObject => { if (payload._status === Pending || payload._status === Uninitialized) { // Transition to the next state. const resolved: ResolvedPayload<T> = (payload: any); resolved._status = Resolved; resolved._result = moduleObject; } }, error => { if (payload._status === Pending || payload._status === Uninitialized) { // Transition to the next state. const rejected: RejectedPayload = (payload: any); rejected._status = Rejected; rejected._result = error; } }, ); if (payload._status === Uninitialized) { // In case, we're still uninitialized, then we're waiting for the thenable // to resolve. Set it as pending in the meantime. const pending: PendingPayload = (payload: any); pending._status = Pending; pending._result = thenable; } } if (payload._status === Resolved) { const moduleObject = payload._result; if (__DEV__) { if (moduleObject === undefined) { console.error( 'lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))\n\n" + 'Did you accidentally put curly braces around the import?', moduleObject, ); } } if (__DEV__) { if (!('default' in moduleObject)) { console.error( 'lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject, ); } } return moduleObject.default; } else { throw payload._result; } } export function lazy<T>( ctor: () => Thenable<{default: T, ...}>, ): LazyComponent<T, Payload<T>> { const payload: Payload<T> = { // We use these fields to store the result. _status: Uninitialized, _result: ctor, }; const lazyType: LazyComponent<T, Payload<T>> = { $$typeof: REACT_LAZY_TYPE, _payload: payload, _init: lazyInitializer, }; if (__DEV__) { // In production, this would just set it on the object. let defaultProps; let propTypes; // $FlowFixMe Object.defineProperties(lazyType, { defaultProps: { configurable: true, get() { return defaultProps; }, set(newDefaultProps) { console.error( 'React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.', ); defaultProps = newDefaultProps; // Match production behavior more closely: // $FlowFixMe Object.defineProperty(lazyType, 'defaultProps', { enumerable: true, }); }, }, propTypes: { configurable: true, get() { return propTypes; }, set(newPropTypes) { console.error( 'React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.', ); propTypes = newPropTypes; // Match production behavior more closely: // $FlowFixMe Object.defineProperty(lazyType, 'propTypes', { enumerable: true, }); }, }, }); } return lazyType; }