code: function getDescriptorForAsyncProp(name) {
    return {
      configurable: false,
      enumerable: true,
      // Save the provided value for async props in a special map
      set(newValue) {
        if (typeof newValue === 'string' || newValue instanceof Promise) {
          this._asyncPropOriginalValues[name] = newValue;
        } else {
          this._asyncPropResolvedValues[name] = newValue;
        }
      },
      // Only the component's state knows the true value of async prop
      get() {
        if (this._asyncPropResolvedValues) {
          // Prop value isn't async, so just return it
          if (name in this._asyncPropResolvedValues) {
            const value = this._asyncPropResolvedValues[name];
  
            // Special handling - components expect null `data` prop expects to be replaced with `[]`
            if (name === 'data') {
              return value || this._asyncPropDefaultValues[name];
            }
  
            return value;
          }
  
          if (name in this._asyncPropOriginalValues) {
            // It's an async prop value: look into component state
            const state = this._component && this._component.internalState;
            if (state && state.hasAsyncProp(name)) {
              return state.getAsyncProp(name);
            }
          }
        }
  
        // the prop is not supplied, or
        // component not yet initialized/matched, return the component's default value for the prop
        return this._asyncPropDefaultValues[name];
      }
    };
  }
docs: Helper: Configures getter and setter for one async prop