5

用例:我有一个使用 JHipster 生成的反应应用程序。我需要从 API 获取数据,映射到表单合同,然后提交表单。

问题:JHipster 生成的reducer 代码不返回promise,那么我如何知道reducer 操作何时完成?获取实体更新状态后如何调用函数?

获取实体并返回 ICrudGetAction:

export interface IPayload<T> { // redux-action-type.ts (JHipster Code from  node_modules)
  type: string;
  payload: AxiosPromise<T>;
  meta?: any;
}
export type IPayloadResult<T> = ((dispatch: any) => IPayload<T> | Promise<IPayload<T>>);
export type ICrudGetAction<T> = (id: string | number) => IPayload<T> | ((dispatch: any) => IPayload<T>);

// Start of my reducer code 
export default (state: AdState = initialState, action): AdState => {
  switch (action.type) {
    case REQUEST(ACTION_TYPES.FETCH_MYENTITY_LIST):
      return {
        ...state,
        errorMessage: null,
        updateSuccess: false,
        loading: true
      };
    case FAILURE(ACTION_TYPES.FETCH_MYENTITY_LIST):
      return {
        ...state,
        loading: false,
        updating: false,
        updateSuccess: false,
        errorMessage: action.payload
      };
    case SUCCESS(ACTION_TYPES.FETCH_MYENTITY_LIST): {
      const links = parseHeaderForLinks(action.payload.headers.link);
      return {
        ...state,
        loading: false,
        links,
        entities: loadMoreDataWhenScrolled(state.entities, action.payload.data, links),
        totalItems: parseInt(action.payload.headers['x-total-count'], 10)
      };
    }
    case ACTION_TYPES.RESET:
      return {
        ...initialState
      };
    default:
      return state;
  }
};
export const getEntity: ICrudGetAction<IMyEntity> = id => {
  const requestUrl = `${apiUrl}/${id}`;
  return {
    type: ACTION_TYPES.FETCH_ENTITY,
    payload: axios.get<IMyEntity>(requestUrl)
  };
};

我尝试这样做并且它有效,但给了我编译错误:

this.props.getEntity(this.props.match.params.id).then((response) => {
    // Map to form attributes and call setState
});

我收到错误消息: TS2339:“IPayload | 类型”上不存在属性“then” ((调度:任何)=> IPayload)'。类型“IPayload”上不存在属性“then”。

这是有道理的,因为我们没有返回承诺。但是我如何更新代码以返回一个承诺,这样我就不会破坏所有自动生成的东西,同时还保持 redux 存储更新?

4

0 回答 0