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
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);
|
|
});
|
|
}
|
|
}
|