t-comm
Version:
专业、稳定、纯粹的工具库
98 lines (95 loc) • 3.83 kB
JavaScript
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _createClass from '@babel/runtime/helpers/createClass';
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
import { doRequest } from './request/cocos-request.mjs';
import '@babel/runtime/helpers/typeof';
/**
* 网络调度引擎
*
* 职责:把"请求拦截器 → doRequest → 响应拦截器 → decorator"串起来,
* 对外暴露一个符合 `NetworkManager.setRequestImpl` 签名的函数。
*
* 调度链:
* 1. 顺序跑 requestInterceptors(任一返回 abort=true 即中止)
* 2. 调 doRequest(wx.request / fetch)
* 3. 顺序跑 responseInterceptors(任一返回 abort=true 即走失败)
* 4. 成功:resolve param.data(通常由 GetDataInterceptor 填好)
* 失败:reject param.data(同上)
* 5. decorator 包裹整个 Promise,做 r=100000 重试等横切逻辑
*/
var NetworkEngine = /*#__PURE__*/_createClass(function NetworkEngine(options) {
var _this = this;
_classCallCheck(this, NetworkEngine);
/** 对外暴露的请求函数:一次完整的 request 调用 */
this.request = function (cfg) {
var decorator = _this.options.decorator;
var runOnce = function runOnce() {
return _this.runCore(cfg);
};
if (decorator) {
return Promise.resolve(decorator(runOnce, cfg));
}
return runOnce();
};
/** 不含 decorator 的单次请求主链(供 decorator 重试时调用) */
this.runCore = function (cfg) {
var _this$options = _this.options,
requestInterceptors = _this$options.requestInterceptors,
responseInterceptors = _this$options.responseInterceptors;
// 1) 请求拦截器链:用 reduce 串成 Promise 链
var reqChain = requestInterceptors.reduce(function (prev, ic) {
return prev.then(function (reqParam) {
return Promise.resolve(ic.interceptor(reqParam)).then(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
abort = _ref2[0],
next = _ref2[1];
if (abort) {
// 中止:把 next 当结果抛给上层
return Promise.reject(next);
}
return next;
});
});
}, Promise.resolve(cfg));
return reqChain
// 2) 底层发起;网络错误直接抛,不走响应拦截器
.then(function (reqParam) {
return doRequest(reqParam).then(function (rawResp) {
return {
reqParam: reqParam,
rawResp: rawResp
};
});
}).then(function (_ref3) {
var reqParam = _ref3.reqParam,
rawResp = _ref3.rawResp;
// 3) 响应拦截器链
var initial = {
request: reqParam,
response: rawResp
};
var respChain = responseInterceptors.reduce(function (prev, ic) {
return prev.then(function (respParam) {
return Promise.resolve(ic.interceptor(respParam)).then(function (_ref4) {
var _ref5 = _slicedToArray(_ref4, 2),
abort = _ref5[0],
next = _ref5[1];
var _a, _b;
if (abort) {
// 业务错误(r !== 0):reject data 给上层(decorator / 业务)
return Promise.reject((_a = next.data) !== null && _a !== void 0 ? _a : (_b = next.response) === null || _b === void 0 ? void 0 : _b.data);
}
return next;
});
});
}, Promise.resolve(initial));
// 4) 成功:GetDataInterceptor 已把 response.data 提出到 param.data
return respChain.then(function (respParam) {
var _a, _b;
return (_a = respParam.data) !== null && _a !== void 0 ? _a : (_b = respParam.response) === null || _b === void 0 ? void 0 : _b.data;
});
});
};
this.options = options;
});
export { NetworkEngine };