Ux.rxEpic

rxEpic为Ajax统一调用函数入口,通过统一调用它可支持如下功能:

  • 在Mock接口和真实接口之间互换;
  • 封装了Rx.ObservableRxjs中的Ajax在一处统一调用;
  • 可调用统一的Ajax入口,包括Header的统一设置;

源代码:

const rxEpic = (type, promise, processor = data => data, mockData = {}, mockProcessor) => {
    if (type && U.isFunction(promise)) {
        // 触发Mock条件
        // 1. 打开Mock环境
        // 2. 提供Mock数据
        if (Env.MOCK && mockData.mock) {
            let processed = mockData.data;
            return Rx.Observable.from(type)
                .map(action => action.payload)
                .map(data => Log.mock(data, mockProcessor ? mockProcessor(data, processed) : processed))
                .map(processor)
                .map(data => Env.dataOut(data));
        } else {
            // 非Mock模式
            return Rx.Observable.from(type)
                .map(action => action.payload)
                .map(promise)
                .switchMap(promise =>
                    Rx.Observable.from(promise)
                        .map(processor)
                        .map(data => Env.dataOut(data))
                );
        }
    } else {
        console.error("[ Ajax ] type or promise is invalid.", type, promise);
    }
};

规则:

  • type为createAction创建的Action的getType调用结果;
  • promise为最终生成的Ajax的Promise对象;
  • processor为响应数据的处理器,如果没有响应数据处理器则直接返回原始的data数据;
  • mockData为Mock数据信息
  • mockProcessor为开启日志监控的Mock数据处理器;

示例:

// 一般在Act.Epic.js中使用
    fnFetchRoomType : $action => Ux.rxEpic(
        $action.ofType(Types.fnFetchRoomType.getType()),
        hotel => Ux.ajaxGet("/api/room-types/hotel/:hid", {
            hid : hotel.key
        }),
        data => Ux.rxAssist(data, "room.type"),
        Mock.fnFetchRoomType
    ),

results matching ""

    No results matching ""