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

/**
* // 使用示例
* 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