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

Javascript 如果没有更新,如何停止接收更新?,javascript,gun,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' }); 如果使用同一对象多次更新节点,则每次侦听器端都会有更新

收听最新消息

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'
});
如果使用同一对象多次更新
节点
,则每次侦听器端都会有更新

{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935385873.435}},"num":3}

{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935385873.435}},"num":3}

{"_":{"#":"j94c5jht6u6KTIoltGt7mHx",">":{"num":1508935386550.19}},"num":3}
如何仅在属性值更改时接收更新

var gun=新gun();
var result=document.getElementById('result');
var节点=枪。get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(函数(v,k){
显示值(v);
console.log('v:',v);
console.log('k:',k);
});
函数显示值(v){
var p=document.createElement(“p”);
var t=document.createTextNode(JSON.stringify(v));
p、 儿童(t);
结果:儿童(p);
};
函数createNode(){
node.put({
统计数据:{
总数:3
},
名称:“特雷克斯”
}); 
}
函数updateNode(){
node.put({
统计数据:{
总数:3
},
名称:“特雷克斯”
});
}
函数deleteNode(){
while(result.firstChild){
result.removeChild(result.firstChild);
}
}
var createNodeBtn=document.getElementById('create_node');
createNodeBtn.onclick=createNode;
var updatenodebun=document.getElementById('update_node');
updateNode n.onclick=updateNode;
var deleteNodeBtn=document.getElementById('delete_node');
deleteNodeBtn.onclick=deleteNode

创造
更新
清洁的
@trex

这里有两件事:

  • 当没有可观察到的更改时停止更新
  • 没有更改时停止更新
  • 这是两件截然不同的事情。让我们看看

    在没有可观察到的更改时停止更新 第二次更新,即使是相同的数据,仍被视为新的更新。以下是一个重要的例子,说明了为什么:

  • Alice将
    foo
    另存为
    1
  • Bob将
    foo
    另存为
    2
  • Alice再次将
    foo
    保存为
    1
    ,然后才听到Bob的更新(因为延迟)
  • 然后Alice将放弃Bob的更新,因为Alice在最近的时间再次保存了相同的数据。因此,虽然这看起来不像是Alice的改变,但它是所有对等方都需要处理的合法改变

    由于上述内容很重要,gun在默认情况下不会进行重复数据消除。您必须使用以下简单逻辑自行消除重复数据:

    var was;
    
    gun.get('some').get('data').on(function(data, key){
        if(was === (was = data)){ return }
        cb(data, key);
    });
    
    注意:JS原语可以是
    ==
    ,但是如果
    数据
    是一个对象(gun中的一个节点),那么您需要添加一些额外的逻辑来进行深入比较,可能需要使用像lodash或下划线这样的实用程序库

    额外的开销逻辑实际上是gun在默认情况下不这样做的另一个原因,因为并非所有应用都需要这种行为。对于需要此行为的应用程序(如您的应用程序),使用此扩展可以轻松自定义枪:

    Gun.chain.uniqueUpdates = function(cb){
        var was;
    
        return this.on(function(data, key){
            /* your deduplication/deep-comparison logic here */
            cb(data, key);
        });
    }
    
    现在,您可以用新模块替换应用程序中的using on

    gun.get('some').get('data').uniqueUpdates(cb);
    
    没有更改时停止更新 你可以很容易地应用上面提到的技术(阻止可观察到的变化),它还可以阻止枪用重复数据开火

    在没有变化的情况下,为什么枪会发射重复数据

    GUN实际上在图的根位置消除重复数据更新,但不幸的是,链接API当前(v0.8.9)没有消除重复数据。这意味着,如果您从外部发送“旧”数据,它将消除重复数据。然而,链式API的内部机制异常复杂,当我们尝试在其中添加重复数据消除时,它造成的错误比事件发射器上重复消息(必须设计为处理多条消息)带来的不便还要多


    这就是说,我们计划在GUN稳定并准备好生产后修复此问题,因为这对我和新开发人员来说一直是个麻烦。从技术上讲,这不是错误的行为,但它是不必要的/令人讨厌的,因此目前优先级为0。

    gun.get(…)
    return?@JamesMonger它返回
    gun
    对象,方法是
    cb(数据,键)
    Gun.chain.uniqueUpdatesexample?@trex调用您传入的回调。因此,您不必在(function(data,key){console.log(key,data)})上执行
    .uniqueUpdates(function(data,key){console.log(key,data)})
    。你真的应该退房!