/** * // 使用示例 * async function f() { * let store = new Store(); * * setTimeout(() => { * store.set('111', '111') * }, 3000) * * console.log('尝试获取值') * let val = await store.waitGetAndDelete('111',1000,10); * * console.log(val) * console.log(store) * } * f() * @returns {Promise} */ /** * Store */ class Store { store = new Map() sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); set(key, value) { this.store.set(key, value) } get(key) { return this.store.get(key) } /** * 获取等待 * @param key * @param timeout 等待时长 * @param reTry 重试次数 * @returns {Promise} */ async waitGet(key, timeout = 100, reTry = 10) { if (timeout <= 0) { timeout = 10; } // 没有时长限制的等待 if (reTry === -1) { while (true) { await this.sleep(timeout) let val = this.store.get(key); if (val != null) { return val; } } } // 有时长限制的等待 for (let i = reTry; i > 0; i--) { let val = this.store.get(key) if (val != null) { return val } await this.sleep(timeout) } return null; } async waitGetAndDelete(key, timeout = 100, reTry = 10) { let value = await this.waitGet(key, timeout, reTry); if (value != null) { this.store.delete(key) } return value } getAndDelete(key) { let value = this.store.get(key); this.store.delete(key) return value } has(key) { return this.store.has(key) } delete(key) { return this.store.delete(key) } } module.exports = Store