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.
92 lines
1.9 KiB
92 lines
1.9 KiB
/** |
|
* // 使用示例 |
|
* 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<void>} |
|
*/ |
|
|
|
/** |
|
* 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<any|null>} |
|
*/ |
|
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 |
|
|
|
|