昨天加班到 10 点多,终于解决了一个困扰半个月的 bug,让哥娓娓道来。
自从项目引入腾讯的 webim 作为推送和消息临时存储以后,页面上经常出现掉消息的问题, 消息发的慢还行,基本能收到,稍微快点,比如两个账号一起发,能给你丢掉一半。。。我 一度怀疑是 webSDK 的问题,因为我们只用到了这个 SDK 的初始化和消息收发这种比较简 单的功能,代码一眼就能望穿,要命的是 android 端和 iOS 端没有这个问题,更更要命的 是昨天我偶然发现新开发的微信端居然也没有这个问题。。这就日了桌子了,都是 webSDK ,脸打的嗖嗖的,哥对这那几十行代码弄了几个小时,中间过程省略。。
总之最后还是通过原始的排除法找到了原因 — 我在 lodash 的 _.each 函数里错误的 使用了 return false, 从 这个 issue 你会看到, return false 会直接将本次迭代停 止掉。。而我的使用场景是一旦消息发快了会堆积到好几条一起过来,我如果在判断中间某 个逻辑的时候使用了 return false 比如下面:
_.each(msgs, (item) => { |
原意是想省去下面的判断去遍历下一条消息, 结果这 return false 直接把循环都终止了。 所以从 ui 界面上看来的效果就是有些消息掉了。。
而实际上 lodash 的文档部分 是有提及的:
Iterates over elements of collection and invokes iteratee for each element. The
iteratee is invoked with three arguments: (value, index|key, collection).
Iteratee functions may exit iteration early by explicitly returning false.