在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
中,但这看起来很难看。
有没有一种首选的方式来保留或访问以前链接的get的状态?
@Leo问得好。
目前有两种方法,如果你能想出更好的方法,请告诉我们!
- 就像你说的那样,做回调嵌套(讨厌!(
- 不要嵌套,在孙回调中使用
this.back()
值得一提的是:使用一些扩展的API,如
gun.open()
,从父级向下加载整个文档。
.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、Mango或GraphQL,后者已经存在于实时订阅中!