Слушайте обновления
var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4')
node.get('stats').on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
Обновить
node.put({
stats: {
num: 3
},
name: 'trex'
});
Если вы обновляете node
одним и тем же объектом несколько раз, каждый раз, когда появляется обновление на стороне слушателя.
{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935385873.435}},"num":3}
{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935385873.435}},"num":3}
{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935386550.19}},"num":3}
Как получить обновление, только если значение свойства было изменено?
var gun = new Gun();
var result = document.getElementById('result');
var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
displayValue(v);
console.log('v:', v);
console.log('k:', k);
});
function displayValue (v) {
var p = document.createElement("p");
var t = document.createTextNode(JSON.stringify(v));
p.appendChild(t);
result.appendChild(p);
};
function createNode () {
node.put({
stats: {
num: 3
},
name: 'trex'
});
}
function updateNode() {
node.put({
stats: {
num: 3
},
name: 'trex'
});
}
function deleteNode() {
while (result.firstChild) {
result.removeChild(result.firstChild);
}
}
var createNodeBtn = document.getElementById('create_node');
createNodeBtn.onclick = createNode;
var updateNodeBtn = document.getElementById('update_node');
updateNodeBtn.onclick = updateNode;
var deleteNodeBtn = document.getElementById('delete_node');
deleteNodeBtn.onclick = deleteNode;
<script src="https://rawgit.com/amark/gun/master/gun.js"></script>
<button type="button" id="create_node">create</button>
<button type="button" id="update_node">update</button>
<button type="button" id="delete_node">clean</button>
<div id=result></div>
@trex,
Здесь есть две вещи:
Это две разные вещи. Давайте посмотрим на них.
Второе обновление, даже если это те же данные, по-прежнему считается новым обновлением. Вот важный пример:
foo
как 1
.foo
как 2
.foo
как 1
AGAIN, прежде чем она услышит обновление Боба (из-за латентности).Тогда Элис откажется от обновления Боба, потому что Алиса снова сохранила те же данные за последнее время. Поэтому, хотя это не похоже на изменение Алисы, это законное изменение, которое все сверстники должны обрабатывать.
Поскольку это важно, пистолет не будет по умолчанию дедуплицировать это. Вам придется дедуплицировать его самостоятельно, используя простую логику:
var was;
gun.get('some').get('data').on(function(data, key){
if(was === (was = data)){ return }
cb(data, key);
});
Примечание: JS-примитивы могут быть
===
, но еслиdata
являются объектом (узлом в ружье), вам нужно добавить дополнительную логику для глубокого сравнения, возможно, используя библиотеку-утилиту, такую как lodash или подчеркивание.
Дополнительная логика - это еще одна причина, по которой пушка не делает этого по умолчанию, потому что не все приложения нуждаются в этом. Для приложений (подобных вашим), которым это необходимо, легко настроить пистолет с этим расширением:
Gun.chain.uniqueUpdates = function(cb){
var was;
return this.on(function(data, key){
/* your deduplication/deep-comparison logic here */
cb(data, key);
});
}
Теперь вы можете заменить использование в своем приложении новым модулем!
gun.get('some').get('data').uniqueUpdates(cb);
Вы можете легко применить вышеупомянутую технику (прекратить наблюдаемые изменения), а также остановить пушку от стрельбы с дублирующимися данными.
Почему пушка стреляет дублирующимися данными, когда нет изменений?
GUN фактически дедуплицирует обновления в корне графа, однако API цепочки, к сожалению, в настоящее время (v0.8.9) не дедуплицирует. Это означает, что если бы вы отправляли внешнюю информацию из старых "старых" данных, она бы дедуплицировала ее. Однако внутренние механизмы API цепочки чрезвычайно сложны, когда мы пытались добавить дедупликацию там, это вызвало больше ошибок, чем неудобство повторяющихся сообщений на эмиттере событий (которые уже должны быть разработаны для обработки нескольких сообщений).
Тем не менее, мы планируем исправить это после того, как GUN стабилен и готов к производству, поскольку это постоянная неприятность для меня и новых разработчиков. Это технически неправильное поведение, но оно не нужно/раздражает, и поэтому на данный момент имеет приоритет 0.
cb(data, key)
в примере Gun.chain.uniqueUpdates
?
.on(function(data, key){ console.log(key, data) })
вы должны делать .uniqueUpdates(function(data, key){ console.log(key, data) })
. Вы действительно должны проверить github.com/amark/gun/wiki/API#open !
gun.get(...)
?Gun
своими методами