var resolve;
var head = { next: new Promise(r => resolve = r) };
function addData(d) {
resolve({
data: d,
next: new Promise(r => resolve = r)
});
}
我写上面的代码来实现类似链表的东西,而在列表中的数据异步加载。
这个“链表”的头是head
。列表中的每个节点都有两个字段,分别为.data
和.next
,就像普通的链表一样。 .next
是一个将解析到列表中的下一个节点的承诺。
每次调用addData(...)
时,列表中当前最后一个节点的.next
字段将解析为新节点,从而成为新的最后一个节点。
我已经在Node.js中验证了上述代码的功能,并且它按预期工作。下面是我用它来验证行为的代码:
var resolve;
var head = { next: new Promise(r => resolve = r) };
function addData(d) { resolve({ data: d, next: new Promise(r => resolve = r) }); }
async function verify() {
while(true) {
head = await head.next;
console.log(head.data);
}
}
verify();
addData(1); // outputs: 1
addData(2); // outputs: 2
addData(3); // outputs: 3
但是,我不知道是否有任何潜在问题(内存,效率)这种结构。此外,我特别担心这一行:
resolve({data: d, next: new Promise(r => resolve = r})
哪里决心被调用,并在同一时间分配。首先应该发生什么,赋值或函数名称解析?这是一个未定义的行为?
谢谢!
无论它是否有效,它肯定是钝的(难以阅读和理解代码的重点)。 – jfriend00
@ jfriend00他只会保留整个链条,如果他保留了一个头部的参考,他不这样做。当然,很容易出错...... – Bergi
@Bergi - 我已经删除了该评论,因为我已经得出结论,这太难理解正在发生什么(在我看来,由于这个原因,糟糕的代码)。但是,OP确实表示“像一个链表”,但我想它根本不是一个真正的链表。我想这只是前一个承诺的更高范围的缓存。没有太多更好的方法来做到这一点,它不那么钝,也不使用更高范围的“解析”变量? – jfriend00