/** * @name 最优回应 * @author 一日 * @description 该函数会最先修改数据,然后再等结果 */ // import {get, set} from 'jsonuri' class BestResponse { version = '0.0.1' config = { timeout: 5000, store: {}, } initial = true remoteStore = {} settings = {} constructor (config) { Object.assign(this.config, config) this.setStore(this.config.store) } setStore (values) { if (this.initial) { this.initial = false this.__initialStoreValues(values) return } this.updateStore(values) } __initialStoreValues (values) { for (let key in values) { this.config.store[key] = values[key] this.remoteStore[key] = values[key] } } setStoreItem (key, value) { this.config.store[key] = value } updateStore (values) { let attrSettingsKeys = Object.keys(this.settings) if (!attrSettingsKeys.length) { this.__initialStoreValues(values) } let attrKeys = Object.keys(values) attrKeys.forEach((key) => { // 更新远程的本地缓存 this.remoteStore[key] = values[key] // 设置中队列中的状态不做强制更新 if (attrSettingsKeys.indexOf(key) === -1) { // 更新不在设置中队列的其余状态 this.config.store[key] = values[key] } }) } set (key, newVal, oldVal) { // 检查setting缓存中的修改任务是否包含当前key,如果包含则清除该缓存 if (this.settings[key] && this.settings[key].timer) { clearTimeout(this.settings[key].timer) delete this.settings[key] } this.settings[key] = { key, newVal, // oldVal: this.config.store[key], timer: null } this.setStoreItem(key, newVal) this.settings[key].timer = setTimeout(() => { clearTimeout(this.settings[key].timer) let isEqual = this.remoteStore[key] === newVal // 复合属性 上报数据为对象 if (typeof newVal === 'object') { let keys = Object.keys(this.remoteStore[key]) isEqual = this.valueStr(this.remoteStore[key]) === this.valueStr(newVal, keys) } if (isEqual) { // 修改成功 console.log(`[bestResponse] 将 ${key} 设置为 ${this.valueStr(newVal)} 修改成功`) delete this.settings[key] return } else { // 修改失败 console.log(`[bestResponse] 将 ${key} 设置为 ${this.valueStr(newVal)} 修改失败,当前值矫回为${this.valueStr(this.remoteStore[key])}`) this.config.store[key] = this.remoteStore[key] delete this.settings[key] return } }, this.config.timeout) console.log(`[bestResponse] 最新设置:`, this.settings[key]) } valueStr (value: any, sorts: string [] | undefined = undefined): string { return typeof value === 'object' ? JSON.stringify(value, sorts) : value } } export default BestResponse