大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

67 lines
2.2 KiB

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<void> {
return new Promise<void>((r) => {
let Lamuda = () => {
r();
};
this.load(items, Lamuda.bind(this), _onProgress, _onItemCom);
});
}
}