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

使用AsyncStorage存储对象时Rating_Count键无法正常自增如何解决?

AsyncStorage 存储计数累加异常问题

需求说明

  • 预期实现:借助AsyncStorage存储应用内评分弹窗的触发配置,每次调用触发函数时,将存储对象内的Rating_Count键值累加1,达到阈值后展示评分弹窗

异常现象

  • 函数多次调用后,代码始终执行else分支逻辑
  • 打印TEST日志时,输出的RATING_COUNT值始终为0
  • 将if判断条件修改为testStorage1 !== null后,打印OH NO日志时输出的Rating_count为NaN,但TEST日志显示的Rating_count仍为0

存在问题的原始代码

const testFunction = async () => {
  var testStorage1 = await AsyncStorage.getItem(IN_APP_RATING_COUNT)
  testStorage1 = JSON.parse(testStorage1);
  console.log('TEST', testStorage1);
  
  const testObject = { 
    Rating_count: testStorage1.Rating_count, // 原代码注释标记的新增取值
    Rating_date: new Date()
  };
  await AsyncStorage.setItem(IN_APP_RATING_COUNT, JSON.stringify(testObject));

  if (testStorage1.Rating_count >= 0) {
    AsyncStorage.getItem(IN_APP_RATING_COUNT)
      .then((testStorage) => {
        testStorage = JSON.parse(testStorage);
        testStorage.Rating_count++;
        AsyncStorage.setItem(IN_APP_RATING_COUNT, JSON.stringify(testStorage));
        console.log('OH NO!', testStorage);
      })
      .catch((error) => { console.log(error) });
  } else {
    AsyncStorage.getItem(IN_APP_RATING_COUNT)
      .then((testStorage) => {
        testStorage = JSON.parse(testStorage);
        testStorage.Rating_count = 0;
        AsyncStorage.setItem(IN_APP_RATING_COUNT, JSON.stringify(testStorage));
        console.log('YESS', testStorage);
      })
      .catch((error) => { console.log(error) });
  }
}

核心问题溯源

  • 无空值兜底逻辑:AsyncStorage无对应键时,getItem返回null,直接执行JSON.parse(null)得到null,后续访问testStorage1.Rating_count会触发读取空属性的异常,中断整个async执行流程
  • 执行逻辑顺序颠倒:代码在做分支判断前,就已经将首次读取到的空值对象写入了存储,后续分支操作覆盖的只是这个初始空值对象,无法实现累加
  • 异步流程失控:分支内没有对异步的getItem、setItem操作做await等待,混用Promise链和async语法,导致代码执行时序和预期完全不符
  • 判断逻辑不符合场景:Rating_count >=0的判断,在值为有效数字0时也会命中if分支,永远无法触发else分支的初始化逻辑,最终计数永远为初始值

修正后可正常运行的代码

// 提前定义存储键常量
const IN_APP_RATING_COUNT = 'in_app_rating_trigger_config'
const testFunction = async () => {
  try {
    // 读取存储值,增加空值兜底判断
    const rawValue = await AsyncStorage.getItem(IN_APP_RATING_COUNT)
    const parsedValue = rawValue ? JSON.parse(rawValue) : null

    // 按场景计算最新计数
    let latestCount
    if (!parsedValue || typeof parsedValue.Rating_count !== 'number') {
      // 首次调用,初始化计数为0
      latestCount = 0
    } else {
      // 非首次调用,计数累加1
      latestCount = parsedValue.Rating_count + 1
    }

    // 统一写入最新配置,避免重复读写存储
    const updateData = {
      Rating_count: latestCount,
      Rating_date: new Date()
    }
    await AsyncStorage.setItem(IN_APP_RATING_COUNT, JSON.stringify(updateData))
    console.log('存储更新完成', updateData)
  } catch (err) {
    console.log('存储操作异常', err)
  }
}

内容的提问来源于stack exchange,提问作者AS10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 20:36:02