Как прекратить получать обновления, если обновлений нет?

1

Слушайте обновления

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>
  • 0
    Что gun.get(...) ?
  • 0
    @JamesMonger возвращает объекты Gun своими методами
Теги:
gun

1 ответ

1
Лучший ответ

@trex,

Здесь есть две вещи:

  1. Остановите обновление, если нет видимых изменений.
  2. Остановите обновление при отсутствии изменений.

Это две разные вещи. Давайте посмотрим на них.

Остановить обновление, если нет наблюдаемых изменений

Второе обновление, даже если это те же данные, по-прежнему считается новым обновлением. Вот важный пример:

  1. Алиса сохраняет foo как 1.
  2. Боб сохраняет foo как 2.
  3. Алиса сохраняет 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.

  • 0
    что делает cb(data, key) в примере Gun.chain.uniqueUpdates ?
  • 0
    @trex Вызывает обратный вызов, который вы передали. Поэтому вместо .on(function(data, key){ console.log(key, data) }) вы должны делать .uniqueUpdates(function(data, key){ console.log(key, data) }) . Вы действительно должны проверить github.com/amark/gun/wiki/API#open !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню