【发布时间】:2016-04-18 15:21:31
【问题描述】:
_.throttle 函数的文档指出:
创建一个限制函数,每次最多只调用一次 func 每等待毫秒。节流功能带有取消 取消延迟函数调用的方法和刷新方法 立即调用它们。提供一个选项对象来指示是否 func 应该在等待的前沿和/或后沿调用 超时。使用提供给 节流功能。对节流函数的后续调用返回 最后一次 func 调用的结果
我对这条线感兴趣:
对受限制函数的后续调用返回 最后一次 func 调用的结果
我试过了:
var throttled = _.throttle(updateModelData, 1000);
service.on('change', function () {
throttled(5);
});
function updateModelData(data) {
// all calls here log 5's
console.log(data);
return data;
}
setTimeout(function() {
throttled(); // here updateModelData is executed with `undefined` value
}, 5000);
问题是throttled() 触发函数而不返回数据。如何调用它以返回最后的数据?
编辑:
根据源码,只有在不存在挂起的函数调用时才会返回值isCalled === false:
function debounced() {
args = arguments;
stamp = now();
thisArg = this;
trailingCall = trailing && (timeoutId || !leading);
if (maxWait === false) {
var leadingCall = leading && !timeoutId;
} else {
if (!maxTimeoutId && !leading) {
lastCalled = stamp;
}
var remaining = maxWait - (stamp - lastCalled),
isCalled = remaining <= 0 || remaining > maxWait;
!!!!! HERE
if (isCalled) {
if (maxTimeoutId) {
maxTimeoutId = clearTimeout(maxTimeoutId);
}
lastCalled = stamp;
result = func.apply(thisArg, args);
}
else if (!maxTimeoutId) {
maxTimeoutId = setTimeout(maxDelayed, remaining);
}
}
...
return result;
}
所以以下将起作用:
var throttled = _.throttle(updateModelData, 10000);
service.on('change', function () {
throttled(5);
});
function updateModelData(data) {
// all calls here log 5's
console.log(data);
return data;
}
setTimeout(function() {
throttled(); // returns 5
}, 15000);
【问题讨论】:
-
什么是
this.getData? -
@elclanrs,我已经从示例中删除了
this.getData(),现在应该清楚了,请看一下 -
@Maximus 你把节流函数返回的值保存在哪里?
-
@Neal,我不知道,该值存储在 lodash 的
debounce函数中。
标签: javascript lodash