Доступ к предыдущим значениям в цепочке gundb

В 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 ответ

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

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

  1. Как и то, что вы сказали, сделать вложение колбэка (фу!).
  2. Не гнездятся, а внуки используют callback 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а мы на е)

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

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

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

Другие вопросы по тегам