Доступ к предыдущим значениям в цепочке gundb - PullRequest
0 голосов
/ 21 декабря 2018

В 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, но это выглядело довольно уродливо.

Есть ли предпочтительный способ сохранения или доступа к состоянию из предыдущих цепочечных операций?

1 Ответ

0 голосов
/ 22 декабря 2018

@ Лео, отличный вопрос.

В настоящее время есть два подхода, и если вы можете придумать лучший, сообщите нам!

  1. Как вы сказали, сделайте обратный вызовnesting (yuck!).
  2. Не вкладывать, и при использовании функции обратного вызова внуков this.back()

Похвальное упоминание: использовать расширенный APIнапример gun.open() для загрузки полного документа от родительского элемента вниз.

this внутри .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 через каждую «обратную» цепочку, например, чтобы получить полный путь от root:

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(), но вместо того, чтобы загружать документ под цепочкой, загружаяdocument создание резервной копии цепочки только для этого изолированного пути.

или аналогичные инструменты, такие как передача схемы родительскому элементу и альтернативная версия .open(), загружающая только элементы всхема вместо всего, что ниже.

Это быстро распространяется на другие механизмы запросов поверх GUN, такие как SQL, Mango или GraphQL , которые уже существуют с подписками в реальном времени!

...