UNPKG

olympus-r

Version:

一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:

249 lines (248 loc) 10.7 kB
import * as tslib_1 from "tslib"; import { core } from "../../core/Core"; import { Injectable } from "../../core/injector/Injector"; import CoreMessage from "../../core/message/CoreMessage"; import Dictionary from '../../utils/Dictionary'; import { extendObject } from "../../utils/ObjectUtil"; import { maskManager } from "../mask/MaskManager"; import NetMessage from "./NetMessage"; import RequestData, { commonData } from "./RequestData"; var NetManager = /** @class */ (function () { function NetManager() { this._responseDict = {}; this._responseListeners = new Dictionary(); core.listen(CoreMessage.MESSAGE_DISPATCHED, this.onMsgDispatched, core); } NetManager.prototype.onMsgDispatched = function (msg) { var observable = this.observable; // 如果消息是通讯消息则做处理 if (msg instanceof RequestData) { // 需要有对应返回才能添加遮罩 if (msg.__useMask && msg.__params.response) maskManager.showLoading(null, "net"); // 指定消息参数连接上公共参数作为参数 extendObject(msg.__params.data, commonData); // 发送消息 msg.__policy.sendRequest(msg); // 派发系统消息 observable.dispatch(NetMessage.NET_REQUEST, msg); } }; /** * 注册一个返回结构体 * * @param {IResponseDataConstructor} cls 返回结构体构造器 * @memberof NetManager */ NetManager.prototype.registerResponse = function (cls) { this._responseDict[cls.type] = cls; }; /** * 添加一个通讯返回监听 * * @param {(IResponseDataConstructor|string)} clsOrType 要监听的返回结构构造器或者类型字符串 * @param {ResponseHandler} handler 回调函数 * @param {*} [thisArg] this指向 * @param {boolean} [once=false] 是否一次性监听 * @param {IObservable} [observable] 要发送到的内核 * @memberof NetManager */ NetManager.prototype.listenResponse = function (clsOrType, handler, thisArg, once, observable) { if (once === void 0) { once = false; } if (!observable) observable = core.observable; var cls = (typeof clsOrType == "string" ? this._responseDict[clsOrType] : clsOrType); var listeners = this._responseListeners.get(cls); if (!listeners) this._responseListeners.set(cls, listeners = []); for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) { var listener = listeners_1[_i]; if (handler == listener[0] && thisArg == listener[1] && once == listener[2]) return; } listeners.push([handler, thisArg, once, observable]); }; /** * 移除一个通讯返回监听 * * @param {(IResponseDataConstructor|string)} clsOrType 要移除监听的返回结构构造器或者类型字符串 * @param {ResponseHandler} handler 回调函数 * @param {*} [thisArg] this指向 * @param {boolean} [once=false] 是否一次性监听 * @param {IObservable} [observable] 要发送到的内核 * @memberof NetManager */ NetManager.prototype.unlistenResponse = function (clsOrType, handler, thisArg, once, observable) { if (once === void 0) { once = false; } if (!observable) observable = core.observable; var cls = (typeof clsOrType == "string" ? this._responseDict[clsOrType] : clsOrType); var listeners = this._responseListeners.get(cls); if (listeners) { for (var i = 0, len = listeners.length; i < len; i++) { var listener = listeners[i]; if (handler == listener[0] && thisArg == listener[1] && once == listener[2] && observable == listener[3]) { listeners.splice(i, 1); break; } } } }; /** * 发送多条请求,并且等待返回结果(如果有的话),调用回调 * * @param {RequestData[]} [requests] 要发送的请求列表 * @param {(responses?:ResponseData[]|Error)=>void} [handler] 收到返回结果或错误后的回调函数 * @param {*} [thisArg] this指向 * @param {IObservable} [observable] 要发送到的内核 * @memberof NetManager */ NetManager.prototype.sendMultiRequests = function (requests, handler, thisArg, observable) { var self = this; var responses = []; var leftResCount = 0; if (!observable) observable = core.observable; for (var _i = 0, _a = requests || []; _i < _a.length; _i++) { var request = _a[_i]; var response = request.__params.response; if (response) { // 监听一次性返回 this.listenResponse(response, onResponse, request); // 记录返回监听 responses.push(response); // 记录数量 leftResCount++; } // 发送请求 observable.dispatch(request); } // 测试回调 testCallback(); function onResponse(response) { if (response instanceof Error) { // 出错了,直接调用回调 handler && handler.call(thisArg, response); } else { // 成功了 for (var key in responses) { var temp = responses[key]; if (temp == response.constructor && this === response.__params.request) { self.unlistenResponse(temp, onResponse, this); responses[key] = response; leftResCount--; // 测试回调 testCallback(); break; } } } } function testCallback() { // 判断是否全部替换完毕 if (leftResCount <= 0) { handler && handler.call(thisArg, responses); } } }; /** * 异步版本的sendMultiRequests * * @author Raykid * @date 2019-03-08 * @param {RequestData[]} [requests] 要发送的请求列表 * @param {IObservable} [observable] 要发送到的内核 * @param {boolean} [canReject=false] 是否允许reject,默认false,即允许重试 * @returns {Promise<ResponseData[]>} 返回一个Promise用于异步监听回调 * @memberof NetManager */ NetManager.prototype.sendMultiRequestsAsync = function (requests, observable, canReject) { var _this = this; if (canReject === void 0) { canReject = false; } return new Promise(function (resolve, reject) { _this.sendMultiRequests(requests, function (responses) { if (responses instanceof Error) { // 错误 canReject && reject(responses); } else { // 正确 resolve(responses); } }, _this, observable); }); }; /** 这里导出不希望用户使用的方法,供框架内使用 */ NetManager.prototype.__onResponse = function (responseCls, result, request) { // 移除遮罩 if (request && request.__useMask) maskManager.hideLoading("net"); // 解析结果 if (responseCls) { var response = new responseCls(); // 执行解析 response.parse(result); // 设置配对请求和发送内核 var observable = core.observable; if (request) { response.__params.request = request; // 由上至下找到最远的一个有效内核 for (var i = request.__observables.length - 1; i >= 0; i--) { var temp = request.__observables[i]; if (!temp || temp.disposed) break; else observable = temp; } } // 派发事件 observable.dispatch(NetMessage.NET_RESPONSE, response, request); // 递归处理事件监听 this.recurseResponse(responseCls, response, request, observable); } else { console.warn("没有找到返回结构体定义:" + responseCls.type); } }; NetManager.prototype.__onError = function (responseCls, err, request) { // 移除遮罩 if (request && request.__useMask) maskManager.hideLoading("net"); // 如果有配对请求,则将返回值发送到请求所在的原始内核里 var observable = request && request.__oriObservable; // 派发事件 observable.dispatch(NetMessage.NET_ERROR, err, request); // 递归处理事件监听 this.recurseResponse(responseCls, err, request, observable); }; NetManager.prototype.recurseResponse = function (responseCls, response, request, observable) { // 先递归父级,与消息发送时顺序相反 if (observable.parent) { this.recurseResponse(responseCls, response, request, observable.parent); } // 触发事件形式监听 var listeners = this._responseListeners.get(responseCls); if (listeners) { listeners = listeners.concat(); for (var _i = 0, listeners_2 = listeners; _i < listeners_2.length; _i++) { var listener = listeners_2[_i]; if (listener[3] == observable) { // 必须是同核消息才能触发回调 listener[0].call(listener[1], response, request); // 如果是一次性监听则移除之 if (listener[2]) this.unlistenResponse(responseCls, listener[0], listener[1], listener[2], listener[3]); } } } }; NetManager = tslib_1.__decorate([ Injectable, tslib_1.__metadata("design:paramtypes", []) ], NetManager); return NetManager; }()); export default NetManager; /** 再额外导出一个单例 */ export var netManager = core.getInject(NetManager);