先看看Leancloud现在是怎么做的:

假设某个对话里我依次发送了1, 2, 3,..., 24, 25共25个数字。
初始化时设置MessageIterator的参数为limit:10,紧接着调用MessageIterator.next(),那么获得的result.value顺序为:16, 17, 18,..., 24, 25。再次调用MessageIterator.next(),则会得到6, 7, 8,..., 14, 15
但是问题来了,一般而言,历史聊天记录都是堆叠在上部,也就是说越久远的历史数据就越处于顶部(#1),消息时间如下图:

(图片里假设一次取五条历史数据)这时对于MessageIterator.next()返回的查询结果里的每条数据,就会有一个在顶部or尾部插入的问题。根据(#1)处的分析,第二次next()返回的消息应当插入到现有消息列表(一般为ul>li)顶部,那么根据next()返回的消息顺序,页面DOM操作顺序就成了下图:

可以看到消息顺序已经不是16, 17, 18, 19,...,24, 25,而是在20处顺序颠倒了。

因此考虑到大多数页面结构都是时间越久的消息越靠上,我觉得MessageIterator返回的消息顺序也应当是按照时间倒序排列,这样我们可以直接将每条消息插入到到顶部就可以了。

有人说可以用javascript里的result.value.reverse()来将返回值点到顺序,但是经我个人实验,这样会使realtime里定义的forEach失效,使得下一次调用MessageIterator.next()时,获取到的消息列表并不是往前10位,而仅仅是往前一位。

这是一个 bug,会在下一个版本修复。在此之前,请先复制这个数组再 reverse,举个例子:

[].concat(result.value).reverse()

从性能角度出发,向页面中插入 10 个标签,建议先拼出一个完整的 html 字符串或者 dom 片段,然后再插入到页面中。这样看是不是统一按照时间升序更加方便了呢。