如果没有更新,如何停止接收更新?
How to stop receiving updates if there is no update?
收听更新
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 ,
这里有两件事:
- 当没有可观察变化时停止更新。
- 没有变化时停止更新。
这是两个截然不同的事情。让我们看看它们。
没有可观察到的变化时停止更新
第二次更新,即使是相同的数据,也仍然被认为是新的更新。这是一个重要的例子来说明原因:
- Alice 将
foo
保存为 1
。
- Bob 将
foo
保存为 2
。
- Alice 在听到 Bob 的更新之前再次将
foo
保存为 1
(由于延迟)。
那么爱丽丝将丢弃鲍勃的更新,因为爱丽丝在最近的时间再次保存了相同的数据。因此,虽然这看起来不像是对 Alice 的更改,但这是所有对等方都需要处理的合法更改。
因为以上内容很重要,默认情况下 gun 不会删除重复数据。您必须使用如下简单的逻辑自行删除重复数据:
var was;
gun.get('some').get('data').on(function(data, key){
if(was === (was = data)){ return }
cb(data, key);
});
Note: JS primitives can be ===
, but if data
is an object (a node in gun) then you'd need to add some extra logic to do a deep-comparison, probably using a utility library like lodash or underscore.
额外的开销逻辑实际上是 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) 不会删除重复数据。这意味着如果您要从外部发送 gun "old" 数据,它会对其进行重复数据删除。然而,链接 API 的内部机制非常复杂,当我们尝试在那里添加重复数据删除时,它导致的错误多于事件发射器上重复消息的不便(它已经被设计为处理多个消息)。
也就是说,我们计划在 GUN 稳定并准备好生产后修复此问题,因为这对我和新开发人员来说一直是个麻烦。从技术上讲,这不是错误行为,但它是 unnecessary/annoying,因此目前优先级为 0。
收听更新
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 ,
这里有两件事:
- 当没有可观察变化时停止更新。
- 没有变化时停止更新。
这是两个截然不同的事情。让我们看看它们。
没有可观察到的变化时停止更新
第二次更新,即使是相同的数据,也仍然被认为是新的更新。这是一个重要的例子来说明原因:
- Alice 将
foo
保存为1
。 - Bob 将
foo
保存为2
。 - Alice 在听到 Bob 的更新之前再次将
foo
保存为1
(由于延迟)。
那么爱丽丝将丢弃鲍勃的更新,因为爱丽丝在最近的时间再次保存了相同的数据。因此,虽然这看起来不像是对 Alice 的更改,但这是所有对等方都需要处理的合法更改。
因为以上内容很重要,默认情况下 gun 不会删除重复数据。您必须使用如下简单的逻辑自行删除重复数据:
var was;
gun.get('some').get('data').on(function(data, key){
if(was === (was = data)){ return }
cb(data, key);
});
Note: JS primitives can be
===
, but ifdata
is an object (a node in gun) then you'd need to add some extra logic to do a deep-comparison, probably using a utility library like lodash or underscore.
额外的开销逻辑实际上是 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) 不会删除重复数据。这意味着如果您要从外部发送 gun "old" 数据,它会对其进行重复数据删除。然而,链接 API 的内部机制非常复杂,当我们尝试在那里添加重复数据删除时,它导致的错误多于事件发射器上重复消息的不便(它已经被设计为处理多个消息)。
也就是说,我们计划在 GUN 稳定并准备好生产后修复此问题,因为这对我和新开发人员来说一直是个麻烦。从技术上讲,这不是错误行为,但它是 unnecessary/annoying,因此目前优先级为 0。