You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:18:31