Доступ к предыдущим значениям в цепочке 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 ответ
@ Лео отличный вопрос.
В настоящее время есть два подхода, и если вы можете придумать лучший, дайте нам знать!
- Как и то, что вы сказали, сделать вложение колбэка (фу!).
- Не гнездятся, а внуки используют 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'
Движение вперед:
- Документация для
.back()
и метаданные внутренней цепочки должны быть улучшены. - В будущем к метаданным цепочки может быть добавлен полный путь для вас, вместо того, чтобы вы его генерировали, и другие подобные общие вещи.
- На практике вы увидите больше расширений цепочки, которые просто автоматизируют это для вас:
Все эти идеи можно строить / расширять на GUN сегодня, даже.open()
менее 50 LOC расширение цепи! Сообщество с удовольствием поможет вам создать эти расширения!
Вроде что-то похожее на .open()
но вместо того, чтобы загружать документ под цепью, загружать документ обратно по цепочке только для этого изолированного пути.
Или подобный инструментарий, например, передача схемы родителю и альтернативная версия .open()
загрузка только элементов в схеме вместо всего, что внизу.
Это быстро распространяется на другие механизмы запросов поверх GUN, такие как SQL, Mango или GraphQL, которые уже существуют с подписками в реальном времени!