首页 > 解决方案 > 访问 gundb 链中的先前值

问题描述

get在 gundb 中,链式查找节点很方便。

例如:

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,但这看起来很丑陋。

是否有一种首选的方式来保留或访问先前链式获取的状态?

标签: gungundb

解决方案


@Leo 好问题。

目前有两种方法,如果您能想到更好的方法,请告诉我们!

  1. 就像你说的那样,做回调嵌套(糟糕!)。
  2. 不要嵌套,并在孙子回调中使用this.back()

荣誉奖:使用一些扩展 API,例如gun.open()从父级向下加载完整文档。

thisinside.on.once回调是回调中数据的链上下文/引用。

你可以用 (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'

向前进:

  1. .back()需要改进内部链元数据的文档。
  2. 为您提供完整路径,而不是让您生成它,以及其他类似的常见事物,将来可能会添加到链元数据中。
  3. 更实际的是,您会看到更多的链扩展,它们只是为您自动化它:

所有这些想法都可以在今天的 GUN 上构建/扩展,甚至.open()少于 50 LOC 链扩展!社区很乐意帮助您构建这些扩展!

就像类似.open()但不是在链下加载文档,而是将文档加载链上,仅用于那个孤立的路径。

或类似的工具,例如将模式传递给父级,以及.open()仅加载模式中的项目而不是下面的所有内容的替代版本。

这迅速扩展到 GUN 之上的其他查询引擎,例如 SQL、Mango 或GraphQL已经存在的实时订阅!


推荐阅读