我们的录音过一段时间会自动删掉。删掉之后页面应该显示「录音已删除」,不该再有任何地方能出声。
这件事我们修了三轮才修干净。
第一轮:以为改完了
服务器删了文件,返回一个「没有了」的状态,页面把播放器换成一块「录音已删除」的提示。
看起来就完了。
第二轮:状态码不对
线上真遇到的时候发现:服务器返回的不是我们以为的那个状态码。
我们的代码只认一种「找不到」,而服务器在这种情况下返回的是另一种(表示「曾经有,现在没了」)。
结果是:它被当成了网络故障,重试三次,然后显示「缓存失败」——一个完全误导人的提示。
这两个状态码都要认。
第三轮:还能点,还能放
改完之后,业主自己又实测了一遍,发现还是能出声。
顶部的播放器确实没了。但页面上还有三条路能触发播放:
- 每行开头的时间码
- 每行末尾的播放小三角
- 正文里点某个词
这三条路都没走顶部那块的逻辑。
而且更麻烦的是:用户本机的浏览器缓存里还留着一份。服务器上删了,本机照放。
定下来的那一句
修完之后,我们把判据写成了一句话,贴在代码注释里:
服务器上有没有这个东西,是唯一的判据。
有,才有播放、缓存、点词出声这一整套; 没有,整页切成「已删除」,不留任何一条能出声的路。
问的必须是服务器(不是本机缓存), 答案必须传到每一个能出声的角落(不只是最显眼的那一块)。
验收的办法也写了一句:服务器说没了之后,页面上还有任何一个地方能出声,就是漏了。
那个「问的必须是服务器」很难
因为浏览器很聪明:你去请求一个文件,它发现本地有缓存,直接把缓存给你,根本不去问服务器。
所以我们另外发了一条明确要求不走缓存的小探针,专门就问一句「这东西还在吗」。以它的答案为准。
否则会出现最尴尬的情况:文件早删了,页面上显示「✓ 已缓存」,照常播放。
这一条的一般形式
三句话,都值得记:
① 判据只能有一个。 两个地方各自判断同一件事,迟早会给出相反的答案,而那一天你不会收到提醒。
② 判据要问对人。 问一个可能过期的副本(缓存、本地文件、上次记下来的值),得到的是「曾经是这样」,不是「现在是这样」。
③ 答案要传到每一处。 最容易漏的不是主流程,是那些边角上的入口——它们通常是后来加的,加的时候没有人想起来还有这么一条规矩。
别处的对应
咨询里最像的是口径。
一个数字,方案里写一遍、附录里写一遍、PPT 里写一遍、邮件里再说一遍。四处各自维护,改的时候一定会漏。
修法是同一个:定一处为准,其余全部指过去。 不是「记得四处都改」——那不是规矩,那是没做完的功能。