请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

updateQueue 中 update 问题

代码

if (pending === null) {
    update.next = update;
 } else {
   update.next = pending.next;
   pending.next = update;
 }

当第一个 update 记做 updateA,被添加时,处理完后 updateQueue 中只有一个 updateA
当第二个 update 记做 updateB 进来时,假设之前的 updateA 还在,这时,就会将两个 update 关联起来,updateB 在前面,也就是说从 updateQueue 拿到的 updateupdateB

updateB.next = updateA
updateA.next = updateB

当第三个 update 记做 updateC 进来时,假设之前两个 update 还在,走的是这个逻辑

 update.next = pending.next;
 pending.next = update;

这里 pending.next 拿到的是 updateA,也就是说这时 updateCupdateA 关联了,而不是 和 updateB 关联

比如下面:

let a = {
    shared:{
        pending:null
    }
}
let pending = a.shared.pending
let update = {a:1}
update.next = update
a.shared.pending = update

let update1 ={b:1}
pending = a.shared.pending
update1.next = pending.next
pending.next = update1
a.shared.pending = update1

let update2 ={c:1}
pending = a.shared.pending
update2.next = pending.next
pending.next = update2
a.shared.pending = update2

let update3 ={d:1}
pending = a.shared.pending
update3.next = pending.next
pending.next = update3
a.shared.pending = update3

图片描述

我一开始以为的结构:D 指向 C 指向 B 指向 A 指向 D
实验下来的结构是:D 指向 A 指向 B 指向 C 指向 D
所以每次插入新的 update ,它的 next 永远指向最早进入 updateQueueupdate

正在回答

2回答

这里其实构建的是一个循环链表,最新的update节点永远位于链表的尾巴上,最新的update的next永远指向链表的头部节点。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕盖茨6544834 #1
    最新的update节点永远位于链表的尾巴上
    -------
    updateQueue.shared.pending 拿到的 update 是链表的尾巴吗,这个update是上一次添加的 update
    回复 有任何疑惑可以回复我~ 2023-12-09 11:50:15
  • 杨艺韬 回复 提问者 慕盖茨6544834 #2
    对的,pending会指向到尾巴上
    回复 有任何疑惑可以回复我~ 2023-12-09 17:50:53
testname 2024-04-11 14:21:53

代码上看是一个单向循环链表

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信