我使用Uint8Arrays和ArrayBuffers发送二进制数据。我能够通过每次创建一个新的Uint8Array和ArrayBuffer来成功地发送它。
出于性能目的(减少垃圾等),我想在下一个消息中重用相同的Uint8Array和ArrayBuffer。在这种情况下,每个消息都有相同的字段,因此字节长度不是问题。我只是覆盖它。
但是,重用会导致发送的数据不正确。
我最好的猜测是,我正在修改下一个消息的ArrayBuffer,而前一个消息仍在发送过程中。这就是问题所在吗?如果是这样,是否有任何方法,我可以检测何时ArrayBuffer不再被WebSocket使用,所以我可以池它?如果不是,还有什么可能导致这种行为?
谢谢!
显然这个错误只是我的逻辑错误。
用二进制发送东西,我写了一个Message对象,它使用位移位和整数加法来填充Uint8Array。当我编写reset函数时,我只重置了position变量,而没有重置数组值,前提是它的函数会正确地覆盖数组。
但是,由于向数组中添加新值使用的是加法(array[0] += newvalue)而不是集合(array[0] = newvalue),因此任何新数据都会被旧值破坏。
我现在觉得自己有点笨。
Dhruv Chopra和Kanaka的评论帮助我指明了正确的方向。我使用10秒间隔的setTimeout函数进行测试,它仍然给我错误的值,这让我意识到这只是我的一个愚蠢的错误。我想把功劳归于他们,但我不知道该怎么做。 尽管如此,还是非常感谢你的帮助!我很感激。 编辑:显然我只能在8小时后回答我自己的问题。为了避免混乱,我明天就这么做。 编辑2:显然我现在可以给评论投票了。再次感谢。