Ionic 2中如何对Storage的异步Promise调用进行排队?
解决Ionic Native Storage并发调用问题的方案
嗨,我之前在使用Ionic Native Storage时也碰到过类似的并发冲突问题,直接同时调用save、get、delete这类方法确实容易导致数据不一致或者操作失败。用Promise队列串行化所有Storage操作是最靠谱的解决方案,下面给你具体的实现思路和代码:
核心思路
维护一个全局的Promise链(队列),所有对Storage的操作都必须等待队列中前一个操作完成后再执行。每次新增操作时,我们把它追加到这个Promise链的末尾,确保操作按顺序执行,从根本上避免并发冲突。
具体实现代码
import { Injectable } from '@angular/core'; import { NativeStorage } from '@ionic-native/native-storage/ngx'; @Injectable({ providedIn: 'root' }) export class StorageService { // 初始化Promise队列,初始状态为已完成的Promise,保证第一个操作能直接执行 private queuePromise: Promise<any> = Promise.resolve(); constructor(private nativeStorage: NativeStorage) {} // 封装saveJob方法 saveJob(jobData: any): Promise<any> { return this.addToQueue(() => { return this.nativeStorage.setItem('job', jobData); }); } // 封装getJob方法 getJob(): Promise<any> { return this.addToQueue(() => { return this.nativeStorage.getItem('job'); }); } // 封装deleteJob方法 deleteJob(): Promise<any> { return this.addToQueue(() => { return this.nativeStorage.remove('job'); }); } // 核心的队列管理方法 private addToQueue(operation: () => Promise<any>): Promise<any> { // 将当前操作追加到队列末尾,更新队列的Promise链 this.queuePromise = this.queuePromise.then(() => { // 执行当前的Storage操作 return operation(); }).catch(err => { // 捕获单个操作的错误,避免队列因为某一次失败而中断后续操作 console.error('Storage操作出错:', err); // 这里返回resolve的Promise让队列继续运行,也可以根据需求抛出错误 return Promise.resolve(null); }); // 返回当前操作的Promise,供外部调用者处理结果 return this.queuePromise; } }
代码说明
- queuePromise:作为队列的载体,初始是一个已resolve的Promise,确保第一个操作能直接触发。
- addToQueue方法:接收一个返回Promise的操作函数,把它串入队列链中,同时处理错误,保证队列不会因为某一个操作失败而卡住后续任务。
- 业务方法(saveJob、getJob、deleteJob):只需要把实际的Storage操作包装成函数传给addToQueue即可,外部调用方式和之前完全一致,但内部已经是串行执行了。
这样不管你怎么随机调用这些方法:
this.storageService.saveJob(job1).then(result => { /* 你的处理逻辑 */ }); this.storageService.saveJob(job2).then(result => { /* 你的处理逻辑 */ }); this.storageService.deleteJob().then(result => { /* 你的处理逻辑 */ });
它们都会严格按照调用顺序依次执行,彻底解决并发操作带来的问题。
内容的提问来源于stack exchange,提问作者Cherryholme
相关产品推荐
相关产品推荐

