在gundb中,链接get来查找节点非常方便。
例如:
grandparent.get("children").map().get("children").map().once(function(grandchild,id) {...})
然而,函数是在孙子的上下文中调用的。如果我想要获取对父节点(或任何其他中间节点)的引用,该怎么办?
最简单的方法是分解查询:
grandparent.get("children").map().once(function(parent,id){
parent.get("children").map().once(function(child,id){
...
}
})但这似乎没有必要。我还尝试在map()中添加一个函数,该函数将当前值存储在this中,但这看起来相当难看。
有没有一种更好的方式来保留或访问以前链接的gets的状态?
发布于 2018-12-22 09:25:32
@Leo是一个很好的问题。
目前有两种方法,如果你能想到更好的方法,请让我们知道!
this.back()荣誉奖:使用像
gun.open()这样的扩展API从父级向下加载完整的文档。
.on或.once回调中的this是回调中数据的链上下文/引用。
你可以用(2)做很多事情,比如:
如果你想从父节点获取更多的数据,你可以使用this.back(2).get('some').get('other').get('data').once(cb)。
然而,大多数时候你只是想要祖辈的路径,因为map是动态的,你不知道路径是什么。
在这种情况下,您可以从链元数据中同步获取:
(假设路径为a.b.c.d.e,我们在e上)
this.back('get') // 'e'
this.back(2).back('get') // 'c'
如果你想通过forEach遍历每个“返回”链,比如说,从根获取完整路径:
var path = [];
this.back(function(at){ path.push(at.get) });
console.log(path.reverse().join('.'));
// 'a.b.c.d.e'下一步:
.back()和内部链元数据需要为您创建完整路径,而不是让您生成完整路径,并且将来可能会将其他类似的常见内容添加到链元数据中。所有这些想法都有可能在今天的GUN上构建/扩展,即使是 .open() 也不到50个LOC链扩展! 很乐意帮助您构建这些扩展!
类似于.open(),但不是加载链下的文档,而是将文档重新加载到链上,只针对那个孤立的路径。
或者类似的工具,比如将模式传递给父模式,以及.open()的替代版本只加载模式中的项,而不加载模式下的所有项。
这将迅速扩展到GUN之上的其他查询引擎,如SQL、芒果或已经存在的实时订阅的GraphQL查询引擎!
https://stackoverflow.com/questions/53876251
复制相似问题