Ux.rxEpic
rxEpic为Ajax统一调用函数入口,通过统一调用它可支持如下功能:
- 在Mock接口和真实接口之间互换;
- 封装了
Rx.Observable让Rxjs中的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
),