diff --git a/pages/index/index.js b/pages/index/index.js index 3cb0b50..eac3296 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -168,11 +168,14 @@ Page({ /** * 拉取额度风险,拼成给用户看的文案 * 说「谁的提醒有风险」而不是「还剩几次额度」——用户理解不了额度这种抽象概念 + * @returns {Promise} 本次刷新是否成功拿到了最新数据。 + * 失败时不清空/覆盖 atRiskText——网络抖动时清空反而会掩盖真实存在的风险, + * 比"文案没更新"更糟;调用方需要这个返回值来判断该给用户什么反馈(见 onTopUp)。 */ async refreshQuota() { try { const res = await api.subscribe('get') - if (!res || !res.success) return + if (!res || !res.success) return false const names = res.atRiskNames || [] let text = '' if (names.length > 0 && names.length <= 3) { @@ -181,9 +184,11 @@ Page({ text = names.slice(0, 3).join('、') + ' 等 ' + names.length + ' 人' } this.setData({ atRiskText: text }) + return true } catch (e) { - // 查询失败就不显示提示,静默处理,不打扰用户 + // 查询失败就不显示提示,静默处理,不打扰用户;atRiskText 保留旧值不清空(理由见上) console.warn('[index] 额度查询失败', e) + return false } }, @@ -198,13 +203,38 @@ Page({ wx.openSetting({ withSubscriptions: true }) return } + + // 显式处理 status === undefined,不让它靠"没匹配上第一个 if"隐式落地: + // undefined 出现在 onShow 里 subscribe.getStatus() 还没返回、用户就点了卡片的情况; + // 这里没法现查状态兜底——getStatus() 是异步的,哪怕 await 一下也会丢失手势上下文, + // 所以有意让 undefined 和 unknown(查询失败)一样,都保守地按 willPrompt 处理, + // 与 utils/subscribe.js 里「unknown 按 willPrompt 保守处理」的取向一致。 + // 代价:如果用户真实状态其实是 mainSwitchOff(通知总开关关了),这里不会拦截去设置页, + // 只会静默调用 wx.requestSubscribeMessage,微信不弹窗、直接判定未同意, + // 用户只会看到下面「未开启提醒」的兜底提示,不会被引导去设置页—— + // 这是已知且可接受的体验降级,不在本次修复范围内。 + const isConservativeFallback = status === undefined || status === 'unknown' + if (isConservativeFallback) { + // 不阻断流程,只留一条日志方便排查——命中这条分支时用户体验会比正常 + // 情况弱一点(见上面的注释),出问题时能在控制台里定位到具体是哪种取舍 + console.warn('[index] onTopUp 命中保守兜底分支,status =', status) + } + subscribe.requestAndReport().then(accepted => { - if (accepted) { - this.refreshQuota() - wx.showToast({ title: '已补充提醒次数', icon: 'success' }) - } else { + if (!accepted) { wx.showToast({ title: '未开启提醒', icon: 'none' }) + return } + // 补额度这步已经成功(微信侧确实同意了),但下面刷新风险文案是另一次独立请求, + // 可能失败;两者不能混为一谈,否则会出现"已补充"toast 和纹丝不动的风险卡片 + // 同时出现的自相矛盾画面。用刷新结果决定 toast 措辞,不对刷新结果做绝对断言。 + this.refreshQuota().then(refreshed => { + if (refreshed) { + wx.showToast({ title: '已补充提醒次数', icon: 'success' }) + } else { + wx.showToast({ title: '已补充,稍后自动更新', icon: 'none' }) + } + }) }) },