2

バグを発見し、追跡しました。ここで私のコードの簡単な例を見る
ことができます。

if()結局のところ、関数自体をデバウンスするのではなく、ステートメントをデバウンスする必要があります。
デバウンスをスタンドアロン関数として保持したいのですが、条件を渡す方法がわかりません。

ポインタはありますか?

コードは次のとおりです。

var foo = function(xyz) {
    alert(xyz);
};

function setter(func, arg1, arg2) {
    return {
        fn: func,
        arg1: arg1,
        arg2: arg2
    };
}

function debounce(someObject) {
    var duration = someObject.arg2 || 100;
    var timer;
    if (timer) {
        clearTimeout(timer);
    }
    timer = setTimeout(function() {
        someObject.fn(someObject.arg1);
        timer = 0;
    }, duration);
}

var toggle = true;

if (toggle) {
    debounce(setter(foo, 'The best things in life are worth waiting for.', 1250));
} else {
    foo('Instant gratification is sweet!!');
}
4

1 に答える 1

8

あなたの例を使用して、トグルを引数1として渡してみませんか...次のようなもの:

var toggle = true;
var debouncedFunk = function(toggle) {
  if (toggle)
    // the function call
  else
    // something else
};
debounce(debouncedFunk, toggle, 1250);

.callFunction オブジェクトと.applyメソッドの使用についても検討する必要があります。これらは、関数を呼び出して引数を渡すためのものです。関数の例を取り上げます。

var example = function(one, two) { 
  // Logic here
};

次の 3 つの方法で呼び出すことができます。

// First
example(1, 2);
// Second
example.call({}, 1, 2);
// Third
example.apply({}, [ 1, 2 ]);

1 つ目は、関数を呼び出す標準的な方法です。最初の と の違いは、.callへの最初のパラメーターが.call関数のコンテキスト オブジェクト (関数this内を指すもの) であり、その後に他のパラメーターが渡されることです (そして には既知のリストが必要です.call。 の利点.applyは引数の関数に配列を渡すことができ、それらがパラメーター リストに適切に割り当てられることを確認します。最初のパラメーターは引き続きコンテキスト オブジェクトです。

現在のように構造化されたオブジェクトを処理する必要がなくなり、デバウンス機能が簡素化されます。

デバウンスの提案:

var debounce = function(funk, delay) {
  var args = [];
  if (arguments.length > 2)
    args = [].slice.call(arguments, 2);
  setTimeout(function() { funk.apply({}, args); }, delay);
};

現在の場合を変更する:

var toggle = true;
var debouncedFunk = function(toggle) {
  if (toggle)
    // Do if true
  else
    // DO if false
};
debounce(debouncedFunk, 1000, toggle);

多分情報が多すぎますか(ごめんなさい)?

最後に、 Underscoreなどのこれらの関数 (および他の多くの便利な関数) が既に実装されているフレームワーク (可能であれば) を使用することをお勧めします。Underscore を使用すると、例は次のようになります。

// Define debouncedFunk and toggle
debouncedFunk = _.bind(debouncedFunk, {}, toggle);
debouncedFunk = _.debounce(debouncedFunk, 1000);
debouncedFunk();

編集

アンダースコアの例を修正しまし_.debounceた。遅延後にのみ実行される関数を返しますが、まだ呼び出す必要があります。

于 2012-06-30T00:05:10.557 に答える