Chức năng
debounce(func, wait, options) {
khác nhau
cuối cùngArgs,
cuối cùng,
kết quả,
timerId,
thời gian gọi cuối cùng = 0,
lastInvokeTime = 0,
dẫn đầu =
SAI
,
Chờ tối đa =
SAI
,
theo sau =
ĐÚNG VẬY
;
nếu như
(
loại của
hàm !=
'chức năng'
) {
ném
mới
Lỗi loại(FUNC_ERROR_TEXT);
}
chờ = chờ || 0;
nếu như
(isObject(tùy chọn)) {
dẫn đầu = !!tùy chọn.dẫn đầu;
Chờ tối đa =
'chờ đợi tối đa'
TRONG
tùy chọn && Math.max((options.maxWait) || 0, chờ);
theo sau =
'theo sau'
TRONG
tùy chọn ? !!options.trailing : theo sau;
}
Chức năng
invokeFunc(thời gian) {
khác nhau
args = lastArgs,
thisArg = lastThis;
lastArgs = lastThis = không xác định;
lastInvokeTime = thời gian;
kết quả = func.apply(thisArg, args);
trở lại
kết quả;
}
Chức năng
leadingEdge(thời gian) {
console.log(
"leadingEdge đặt thời gian chờ"
)
lastInvokeTime = thời gian;
timerId = setTimeout(timerExpired, chờ);
trở lại
dẫn đầu ? invokeFunc(thời gian) : kết quả;
}
Chức năng
remainingWait(thời gian) {
khác nhau
timeSinceLastCall = thời gian - lastCallTime,
timeSinceLastInvoke = thời gian - lastInvokeTime,
kết quả = chờ - thời gianKể từ lần gọi cuối;
console.log(
"còn lạiChờ"
,kết quả)
trở lại
Chờ tối đa ===
SAI
? kết quả: Math.min(result, maxWait - timeSinceLastInvoke);
}
Chức năng
shouldInvoke(thời gian) {
console.log(
"nênGọi"
)
khác nhau
timeSinceLastCall = thời gian - lastCallTime,
timeSinceLastInvoke = thời gian - lastInvokeTime;
console.log(
"thời gian"
,thời gian,
"Thời gian gọi cuối cùng"
,cuộc gọi cuối cùng,
"thời gianKểTừCuộcGọiCuối Cùng"
,thời gianKểTừCuộcGọiCuối Cùng)
console.log(
"thời gian"
,thời gian,
"Thời gian gọi cuối cùng"
,lastInvokeTime,
"thời gianKểTừLầnGọiCuối"
,thời gianKểTừLầnGọiCuối)
console.log(
"nên?"
,(!lastCallTime || (thời gianKể từ cuộc gọi cuối cùng >= chờ) ||
(thời gianKểTừCuộcGọiCuối Cùng < 0) || (maxWait !==
SAI
&& timeSinceLastInvoke >= maxWait)))
trở lại
(!lastCallTime || (timeSinceLastCall >= chờ) ||
(thời gianKểTừCuộcGọiCuối Cùng < 0) || (maxWait !==
SAI
&& timeSinceLastInvoke >= maxWait));
}
Chức năng
hẹn giờ Hết hạn() {
console.log(
"hết giờ"
)
khác nhau
thời gian = Ngày.hiện tại();
nếu như
(nênGọi(thời gian)) {
trở lại
trailingEdge(thời gian);
}
console.log(
"Khởi động lại bộ đếm thời gian."
,thời gian,còn lạiChờ(thời gian))
console.log(
"timerExpired đặt thời gian chờ"
)
timerId = setTimeout(timerExpired, remainingWait(thời gian));
}
Chức năng
trailingEdge(thời gian) {
xóa thời gian chờ(timerId);
timerId = không xác định;
console.log(
"theo sau"
, theo sau,
"lastArgs"
,lastArgs)
nếu như
(theo sau && lastArgs) {
trở lại
invokeFunc(thời gian);
}
lastArgs = lastThis = không xác định;
trở lại
kết quả;
}
Chức năng
Hủy bỏ() {
nếu như
(timerId !== không xác định) {
xóa thời gian chờ(timerId);
}
lastCallTime = lastInvokeTime = 0;
lastArgs = lastThis = timerId = không xác định;
}
Chức năng
xả() {
trở lại
timerId === không xác định ? kết quả: trailingEdge(Date.now());
}
Chức năng
đã bị trả lại() {
khác nhau
thời gian = Ngày.bây giờ(),
isInvoking = shouldInvoke(thời gian);
console.log(
"thời gian"
,thời gian);
console.log(
"đang gọi"
,isInvoking);
lastArgs = đối số;
cuối cùngĐây =
cái này
;
lastCallTime = thời gian;
nếu như
(đang gọi) {
nếu như
(timerId === không xác định) {
trở lại
leadingEdge(thời gian gọi cuối cùng);
}
xóa thời gian chờ(timerId);
console.log(
"đặt thời gian chờ"
)
timerId = setTimeout(timerExpired, chờ);
trở lại
invokeFunc(thời gian gọi cuối cùng);
}
trở lại
kết quả;
}
debounced.cancel = hủy;
debounced.flush = xả;
trở lại
bị dội lại;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!