import * as Page from "../types/page"; // type Queue = [() => void, () => void]; export default class Loader { private $pages: Record; private $status: Record; // 页面的加载状态:1正在加载 2加载完成 private $queue: Record = {}; constructor() { this.$pages = {}; this.$status = {}; // this.$queue = {}; } /** * 通过fetch发送请求 * @param url */ private fetch(url: string) { fetch(url) .then((response) => { let data = response.json(); this.$pages[url] = data as any; this.$queue[url].forEach(([resolve, reject]) => { resolve(this.$pages[url]); }); this.$status[url] = 2; }) .catch((e) => { this.$queue[url].forEach(([resolve, reject]) => { reject(this.$pages[url]); }); delete this.$status[url]; }) .finally(() => { this.$queue[url] = []; }); } /** * 加载页面 * @param url * @param force */ public load(url: string, force = false): Promise { // this.$queue[url] = this.$queue[url] || [] // 正在加载 if (this.$status[url] === 1) { return new Promise((resolve, reject) => { this.$queue[url].push([resolve, reject]); }); } // 不强制加载,且已经加载过 if (!force && this.$status[url] === 2) { return Promise.resolve(this.$pages[url]); } // 没加载过 return new Promise((resolve, reject) => { this.$queue[url] = [[resolve, reject]]; this.fetch(url); }); } }