1

一部の場所では、関数のインスタンスを1つだけ実行する必要があります。

このコードは私のために働きます:

function example() { 
    var that = this; 
    if(that.running) { 
       return false; 
    }
    that.running = true; 
    $.get(url, {}, function (data) {
         that.running = false; 
    }); 
}

どうすればそれを改善し、より再利用可能にすることができますか?

UPDこれがFritsvanCampenの回答に基づく解決策です。

function make_run_once(callback) {
    callback.running = false;
    return function () {
        if(callback.running) {
            return false;
        }
        callback.running = true;
        deferred = $.Deferred();
        deferred.done(function () {
            callback.running = false;
        });
        callback(deferred);  // pass deferred to callback so it can resolve at it's own leisure
    };
}
4

2 に答える 2

2

そのためにjQueryの「遅延」機能を使用することをお勧めします。

function decorate(fn) {
    var deferred;
    return function(){
        if (!deferred) {
            deferred = new jQuery.Deferred;
            fn(deferred.resolve); // pass in the callback
        }
        return deferred;
    };
}

装飾された関数は常に同じDeferredオブジェクトを返します。これは、最初の呼び出しで開始された元の関数からのコールバックで解決されます。

于 2012-08-28T15:49:32.397 に答える
0

このようなもの?

function make_run_once(callback) {
    var deferred = false;
    return function () {
        if (false === deferred) {
            return;
        } else {
            deferred = $.Deferred();
            deferred.done(function () {
                deferred = false;
            });
            callback(deferred);  // pass deferred to callback so it can resolve at it's own leisure
        }
    };
}

var once = make_run_once(function (deferred) {
    // do stuff, possible ajax stuff
    setTimeout(function () {
        deferred.resolve();  // resolve at some point so it become unblocked again
    }, 100);
});
once(); // run
once(); // block
once(); // block
once(); // block
setTimeout(once, 500);  // run

他のリクエストを「置き換える」リクエストはどうですか?それはありますか?オートコンプリート機能のように。それを機能させるには、それを変更する必要があります。新しいリクエストを無視するのではなく、最新のリクエストを保持し、最後のリクエストが完了したときにそれを実行する必要があります。

于 2012-08-28T13:00:59.710 に答える