使用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
相关产品推荐
相关产品推荐

