假设我有一个服务器,每当客户端的数据发生更改时,它都会向其客户端发送数据。客户端类如下:
function Client() {
this.data = {};
this.update = function (key, value) {
this.data[key] = value;
this.emitUpdate();
};
this.emitUpdate = function () {
// tell server to send this client's data
};
}
var myClient = new Client();
如果我只是改变一个东西:
myClient.update("name", "John");
服务器会使用客户端的新信息更新所有客户端,这很好。
但是,如果我同时从我的应用程序中的不同位置更改多个内容:
if (something === true) {
myClient.update("something", true);
} else {
myClient.update("something_else", true);
}
myClient.update("age", Date.now());
总会有两件事情被改变,emitUpdate()
将被调用两次。服务器将发送数据两次,所有客户端都必须渲染两次。想象一下发生100个这样的更改... 这将是一个很大的开销,考虑到服务器可以只发送一次更新,因为所有这些更改都发生在同一时间段内。
我如何使 emitUpdate()
在每个调用栈中仅被调用一次?我使用了 underscore.js 并查看了 defer()
和 throttle()
函数。问题是,我需要它们的效果结合起来。
var log = function () {
console.log("now");
};
// logs "now" 10 times
for (let i = 0; i < 10; i++) {
_.defer(log);
}
// logs "now" 10 times
var throttled = _.throttle(log, 0);
for (let i = 0; i < 10; i++) {
throttled();
}
如果我使用
throttle()
并且使用不同的 wait
(如 1
或 2
),结果会不一致 - 有时只调用一次,有时调用多次。我需要这样一个函数:
// logs "now" once
var magic = _.deferottle(log);
for (let i = 0; i < 10; i++) {
magic();
}
有没有一种方法能够实现它?
emitUpdate
与update
分开,并根据需要调用前者呢? - hindmost