import ResLoadItem from "./ResLoadItem"; /** * 资源加载组 * 负责多个资源加载项的统一加载 */ export default class ResLoadGroup { /** * 加载资源列表集合 * ! 这里是依次加载并不是同时加载的 * @param items 资源加载项集合 * @param onCompleted 完成时回调 * @param _onProgress 加载进度回调 * @param _onItemCom 单个资源项加载完成回调,会带上该资源项实例作为参数 */ public static load(items: ResLoadItem[], onCompleted: Function, _onProgress?: Function, _onItemCom?: Function) { //没有加载项 if (items.length == 0) { //加载完成 onCompleted(); if (_onProgress) {_onProgress(1);} return; } //浅拷贝,防止污染源列表 items = [...items]; //异步列表长度 let _length: number = items.length; //一步一步消费异步列表 let _f: Function = () => { if (items.length > 0) { let onItem: ResLoadItem = items.shift(); let lamuda = (i) => { //传出总进度 _onProgress(((_length - items.length - 1) + i) / _length,_length); }; onItem.loadAsync(lamuda.bind(this)).then(() => { //传出单个加载项加载完成事件 _onItemCom(onItem); _f(); }); } else { //加载完成 onCompleted(); } } //执行递归加载方法 _f();//归加载方法 } /** * 异步加载资源列表集合 * @param items 资源加载项集合 * @param _onProgress 加载进度回调 * @param _onItemCom 单个资源项加载完成回调,会带上该资源项实例参数 */ public static loadAsync(items: ResLoadItem[], _onProgress?: Function, _onItemCom?: Function): Promise { return new Promise((r) => { let Lamuda = () => { r(); }; this.load(items, Lamuda.bind(this), _onProgress, _onItemCom); }); } }