_.debounce()λ₯Ό μ¬μ©νμ¬ λλ°μ΄μ€λ ν¨μλ₯Ό λ§λ λ€μ 3κ°μ λ€λ₯Έ μΈμ μΈνΈλ‘ μ°μν΄μ 3λ² νΈμΆνλ©΄ (v1.1.7 νμ¬) λνλ νμ΄λ‘λ ν¨μκ° μ΅μ’ μ μΌλ‘ λ€μμμ μ§μ ν μΈμλ‘ νΈμΆλ©λλ€. μΈ λ²μ§Έ νΈμΆ - 첫 λ²μ§Έ λ° λ λ²μ§Έ μΈμκ° μμ λ©λλ€.
μ΄κ²μ μ’ μ’ μ ν¨νμ§λ§(κ·Έλ¦¬κ³ μΌλ°μ μΌλ‘ ν€ λλ°μ΄μ±μ΄ μννλ μμ , λ°λΌμ ν©λ¦¬μ μΈ κΈ°λ³Έκ°) λλ λλ°μ΄μ€λ₯Ό μ¬μ©νμ¬ μΈμλ₯Ό λμ νκ³ μΆμ΄ν©λλ€. μλ₯Ό λ€μ΄ ν λ²μ μ¬λ¬ ν€λ₯Ό κ°μ Έμ¬ μ μλ AJAX νΈμΆμ΄ μμΌλ―λ‘ λλ°μ΄μ€λ₯Ό μ¬μ©νμ¬ λ²νΌλ§ν©λλ€. ν€λ₯Ό μ μ λλ₯΄κ³ κ²°ν©λ μμ²μ λ°ννμμμ€.
λ°λΌμ λ΄ μ μμ λλ°μ΄μ€κ° 2κ°μ μΈμλ‘ νΈμΆλ μ νμ μΈ λ²μ§Έ "κ²°ν©" μΈμλ₯Ό μ·¨νλ€λ κ²μ λλ€.
κ²°ν© λ§€κ°λ³μμ κ°μ΄ μ λ¬λμ§ μμΌλ©΄ κΈ°λ³Έ κ²°ν©μ΄ κΈ°μ‘΄ λμμ μ μ§ν©λλ€.
function(acc, newargs) { return newargs; }
κ·Έλ¬λ 첫 λ²μ§Έ μΈμ μ§ν©μ μ¬μ©νλλ‘ κ²°μ ν μλ μμ΅λλ€.
function(acc, newargs) { return acc || newargs; }
λλ λ΄κ° μνλ κ²μ λ¨μν λͺ¨λ μΈμλ₯Ό μΆκ°νλ κ²μ
λλ€.
function(acc,newargs) { return (acc || []).concat(newargs); }
λ¬Όλ‘ λ€λ₯Έ μ¬λλ€μ λ λ©μ§ μΌμ νκ³ μΆμ΄ν μλ μμ΅λλ€.
μ΄λ₯Ό μν΄μλ λ΄λΆ νκ³ κΈ°λ₯μ λ€μκ³Ό κ°μ΄ λ³κ²½ν΄μΌ ν©λλ€.
// Internal function used to implement `_.throttle` and `_.debounce`.
var limit = function(func, wait, debounce, combine) {
var timeout, allargs;
return function() {
var context = this;
allargs = combine(allargs, slice.call(arguments,0))
var throttler = function() {
timeout = null;
var args = allargs;
allargs = undefined;
func.apply(context, args);
};
if (debounce) clearTimeout(timeout);
if (debounce || !timeout) timeout = setTimeout(throttler, wait);
};
};
κ·Έλ° λ€μ μ§μ λμ§ μμ κ²½μ° κΈ°λ³Έκ°μ μ¬μ©νμ¬ μ μΈμλ₯Ό μλ½νκ³ μ λ¬νλλ‘ λλ°μ΄μ€λ₯Ό λ³κ²½ν©λλ€.
_.debounce = function(func, wait, combine) {
return limit(func, wait, true, combine || function(acc,newargs) { return newargs; });
};
ν΄λΉ μ€λ‘ν ν¨μλ νμ¬ μ²« λ²μ§Έ μΈμ μ§ν©λ§ μ¬μ©ν©λλ€(μ€λ‘νμ 첫 λ²μ§Έ νΈμΆμ λκΈ° λ°λ¦¬μ΄ λ΄μ λ°μνλ νΈμΆμ ν¨κ³Όμ μΌλ‘ 무μνκ³ μΈμμ 첫 λ²μ§Έ νΈμΆ μ§ν©μ μ¬μ©νλ©°, λλ°μ΄μ€λ λκΈ° κΈ°κ° λ΄μ λ°μνλ μνμ€μ λ§μ§λ§ νΈμΆμ μ μΈν λͺ¨λ νΈμΆμ ν¨κ³Όμ μΌλ‘ 무μν©λλ€. μλ‘ κ°μ), λ°λΌμ νμ¬ κΈ°λ³Έ λμμ λ€μ μ μ§νλ €λ©΄ μλλ₯Ό μ μν©λλ€.
_.throttle = function(func, wait, combine) {
return limit(func, wait, false, combine || function(acc,newargs) { return acc || newargs; });
};
μ΄κ²μ μΈμ λͺ©λ‘μ μ μ§ κ΄λ¦¬νκΈ° μν΄ κ³Όλν λνΌ μμ΄ μ΄ κΈ°λ₯μ λ¬μ±νλ κ°μ₯ μ½κ³ μΌλ°μ μΈ λ°©λ²μΈ κ²μ²λΌ 보μ΄μ§λ§ λ°μ€μ λ³κ²½νμ§ μκ³ μ΄λ₯Ό λ¬μ±νλ μ¬μ΄ λ°©λ²μ΄ μλμ§ μκ³ μΆμ΅λλ€.
λ΄ μμ μ μ μμ λν΄ μΈκΈνμλ©΄, Combine() νΈμΆμ νμ΄λ‘λ ν¨μμ λμΌν 컨ν μ€νΈλ₯Ό μ§μ ν΄μΌ νλ―λ‘
allargs = combine.apply(this, [allargs, slice.call(arguments,0)])
μΈμκ° μ»¨ν μ€νΈ κ°μ²΄μ μ‘μΈμ€ν΄μΌ νλ κ²½μ°....
μ΄μ λ§μ€ν°μμ μμ ν΄μΌ ν©λλ€. throttle
λ νμ μ΅μ μΈμ 볡μ¬λ³Έμ μ¬μ©νκ³ , μ¦μ ν λ² μ€νλκ³ , κ·Έ ν N
μ΄λ§λ€ ... κ·Έλ¦¬κ³ N
μ΄ νμ μ체μ μΌλ‘ μ¬μ€μ λλ μ¬λ°λ₯Έ λμμ λνλ΄μΌ ν©λλ€. λ§μ§λ§ νν νΈλ¦¬κ±°κ° λ°μνμ΅λλ€.
μ΄ μμ²μ μν΄ μ κΈ°λ λ¬Έμ κ° μ¬μ ν λ§μ€ν°μ μ μ©λκΈ° λλ¬Έμ κ·νμ κ°κΉμ΄ μκ²¬μ΄ λ€λ₯Έ λ¬Έμ (μλ§λ #170)μ μ μ©λλ€κ³ μκ°ν©λλ€.
κ²°ν© μ€μΈ νΈμΆμμ μΈμλ₯Ό λλ°μ΄μ€νκ±°λ μ€λ‘νλ‘ λμ νλ μ¬μ΄ λ°©λ²μ μ¬μ ν ββμμΌλ©° μ νμ κ²°ν© μΈμκ° μ§μ λμ§ μμ κ²½μ° κΈ°λ³Έ λμμ λ³κ²½νμ§ μκ³ κ·Έλλ‘ λλ μ μ©ν μ νμ μΆκ° κΈ°λ₯μ΄λΌκ³ μκ°ν©λλ€.
μ, λΉμ λ§μ΄ λ§μ. λμ μΈμλ λ°μ€μ λ²μλ₯Ό λ²μ΄λ©λλ€ -- _.throttle
λ° _.debounce
ν¨μ μΈλΆμ μ’μ μμΉμ λμ λ λ°μ΄ν°λ₯Ό μμ λ‘κ² μ¨κΈΈ μ μμ΅λλ€.
μ κ°μ€λ½κ²λ λλ°μ΄μ€λ μκ° μ΄κ³Όκ° μλ μ¬λ¬ νΈμΆμ λν΄ μΌμ’ μ μΌμͺ½ μ κΈ°(μ€μ)λ‘ κ°μ£Όνλ―λ‘ λμ κΈ°λ ... νμ§λ§ κ·Έκ²μ λΉμ μ νΈμΆμ λλ€ :)
μ’μμ, κ³μ λλ리λ κ²μ μλμ§λ§ λμ€μ λκ΅°κ°κ° μ΄κ²μ λ³΄κ³ λμΌν μμ μ μννλ λ°©λ²μ κΆκΈν΄νλ κ²½μ°λ₯Ό λλΉνμ¬ μ΄κ²μ΄ λλ°μ΄μ€ μ체λ₯Ό μμ νμ§ μκ³ κ°μ₯ κΉ¨λν λ°©λ²μ΄λΌκ³ μκ°νμ΅λλ€(λλ _ κ°μ²΄μ μΆκ°νμ§λ§ λ€λ₯Έ μ¬λλ€μ μ νΈνμ§ μμ μ μμ΅λλ€. μκ²)
_.mixin({
debounceReduce: function(func, wait, combine) {
var allargs,
context,
wrapper = _.debounce(function() {
var args = allargs;
allargs = undefined;
func.apply(context, args);
}, wait);
return function() {
context = this;
allargs = combine.apply(context, [allargs, Array.prototype.slice.call(arguments,0)]);
wrapper();
};
}
})
μ΄κ²μ κ²°ν© ν¨μμ μν΄ μΈμκ° κ°μλ λλ°μ΄μ€λ ν¨μλ₯Ό μ 곡ν©λλ€. μλ₯Ό λ€μ΄,
delayLog = _.debounceReduce(function() { console.log(arguments); }, 5000,
function(acc,args) { return (acc || []).concat(args); });
delayLog(3,4);
delayLog(7,8,9);
λͺ μ΄ νμ λ°°μ΄ [3,4,7,8,9]λ‘ console.logλ₯Ό νΈμΆν©λλ€.
@schmerg β μ΄κ²μ λ§€μ° μ μ©ν΄ 보μ λλ€. MIT λΌμ΄μ μ€μ λ°λΌ ν΄λΉ μ½λμ λΌμ΄μ μ€λ₯Ό λΆμ¬νμκ² μ΅λκΉ? ("μ"λ‘ μΆ©λΆν©λλ€!)
@markjaquith λ¬Όλ‘ μ΄μ£ - κ·Έλ μ΅λλ€. λ€νμ΄λ€...
λκ΅°κ°κ° μμ μμ μ΅μ js λ²μ μ μ λ°μ΄νΈ/μ€λͺ νκ³ μΆλ€λ©΄:
_.mixin({
debounceReduce(func, wait, combine) {
let allArgs; // accumulator for args across calls
// normally-debounced fn that we will call later with the accumulated args
const wrapper = _.debounce(() => func(allArgs), wait);
// what we actually return is this function which will really just add the new args to
// allArgs using the combine fn
return (...args) => {
allArgs = combine(allArgs, [...args]);
wrapper();
};
},
});
@kmanislands μλ
νμΈμ, κ·νμ λ²μ μ wrapper()
allArgs
λ₯Ό μ¬μ€μ νμ§ μμΌλ―λ‘ func()
μ λν νμ νΈμΆμ νμ¬ λ°°μΉλΏλ§ μλλΌ argsμ μμ¬μ λ°°μΉλ κ°μ Έμ΅λλ€.
λ€μκ³Ό κ°μμΌ ν©λλ€.
const wrapper = _.debounce(() => {
const args = allArgs;
allArgs = undefined;
func(args);
}, wait);
@markjaquith +1
λν func( args )
λ func.apply(context, args);
λ₯Ό μ¬μ©νλ μλ λ²μ κ³Ό λ€λ¦
λλ€.
μ μμ κ²½μ° args
λ λμ func()
μμ κ·Έλλ‘ μ¬μ©λλ λ°λ©΄, λμ€ _(μλ μ½λ)_μμλ μΌλ° ν¨μμμ arguments
μ€ νλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. λλ es6 ν» νμ΄ν ν¨μμμ ( ...args )
.
κ°μ₯ μ μ©ν λκΈ
μ’μμ, κ³μ λλ리λ κ²μ μλμ§λ§ λμ€μ λκ΅°κ°κ° μ΄κ²μ λ³΄κ³ λμΌν μμ μ μννλ λ°©λ²μ κΆκΈν΄νλ κ²½μ°λ₯Ό λλΉνμ¬ μ΄κ²μ΄ λλ°μ΄μ€ μ체λ₯Ό μμ νμ§ μκ³ κ°μ₯ κΉ¨λν λ°©λ²μ΄λΌκ³ μκ°νμ΅λλ€(λλ _ κ°μ²΄μ μΆκ°νμ§λ§ λ€λ₯Έ μ¬λλ€μ μ νΈνμ§ μμ μ μμ΅λλ€. μκ²)
μ΄κ²μ κ²°ν© ν¨μμ μν΄ μΈμκ° κ°μλ λλ°μ΄μ€λ ν¨μλ₯Ό μ 곡ν©λλ€. μλ₯Ό λ€μ΄,
λͺ μ΄ νμ λ°°μ΄ [3,4,7,8,9]λ‘ console.logλ₯Ό νΈμΆν©λλ€.