如果没有更新,如何停止接收更新?

时间:2017-10-25 12:51:57

标签: javascript gun

收听更新

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>

1 个答案:

答案 0 :(得分:1)

@trex,

这里有两件事:

  1. 如果没有可观察更改,请停止更新。
  2. 没有变化时停止更新。
  3. 这是两件非常不同的事情。让我们看看它们。

    没有可观察的变化时停止更新

    第二次更新,即使它是相同的数据,仍被视为新的更新。以下是一个重要的例子:

    1. Alice将foo保存为1
    2. Bob将foo保存为2
    3. Alice在听到Bob的更新(因为延迟)之前,将foo保存为1 AGAIN。
    4. 那么Alice会放弃Bob的更新,因为Alice 在最近的时间再次保存了相同的数据。因此,虽然这看起来不像是对Alice的改变,但这是所有同行都需要处理的合法变更。

      因为上述内容非常重要,所以默认情况下枪不会重复删除。你必须使用一些像这样的简单逻辑来重复删除它:

      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优先权。