7

いくつかのデータをロードするために2秒ごとに呼び出される次の関数があります。それは、応答で処理を行うための関数[do]を登録します。(例は簡略化されています)。

function doRequest (){
    $.ajax({ url: 'www.google.com.pe', success: function (response) {do(response)} });
}

function do (text){
    var i = setInterval(doRequest, 2000);
}

[do]関数が呼び出されるたびに呼び出される関数を、do関数内のリスナーへの呼び出しを追加せずに作成できる方法があるのではないかと思います。前もって感謝します。プラグインのように、jqueryでそれを行うためのより良い方法があれば、私は助けていただければ幸いです。

[編集]アイデアはそれが機能するかどうかではありません。私の質問は、すでに実装されている「do」関数にカスタムリスナーを追加できるかどうかについてでした。addActionListener( "do"、 "after"、doSomeThingElse)のようなものなので、do関数が終了した直後に他のことを行うことができます。

4

3 に答える 3

6

doまず、関数を呼び出す代わりに関数を渡す必要があるため、簡略化されたバージョンは機能しません。

function doRequest (){
    $.ajax({ url: 'www.google.com.pe', success: _do });
}

doしかし、呼び出されるたびに他のコードを実行する方法を尋ねているようです。

doが関数内でのみ呼び出される場合は、適切なタイミングdoRequest()で呼び出す無名関数に他のコードを追加するだけdoです。

function doRequest (){
    $.ajax({ url: 'www.google.com.pe', success: function(response) {
          // Run your other code
          //   or invoke another function.
          _do(response);
    } });
}

より一般化したい場合は、do他のコードの後に​​呼び出す関数を返す関数デコレータを作成できます。

function doFactory(fn) {
    return function() {
        fn.apply(this, arguments);
        _do.apply(this, arguments);
    }
}

次に、次のような関数を作成します。

var doFoo = doFactory(function() {
    console.log("foo");
});

要件がの前処理に固有である場合は、次のresponseようにやり直すことができます。

function doFactory(fn) {
    return function(response) {
        _do.call(this, fn.call(this, response));
    }
}

次に、fn操作して戻りresponseます。

var doFoo = doFactory(function(response) {
    return response + "foo";
});
于 2012-10-15T19:56:04.870 に答える
5

既存のコードをそのままにしておきたい場合は、do()別の関数でラップしてdo()、新しい関数(たとえばdo_this_as_well())を呼び出すことができます。

以下の例を参照してください(予約キーワードの混乱を避けるために名前を変更do()しました)。これが機能するのは、グローバル関数が関数オブジェクトを含む変数にすぎないためです。これらの変数は、この場合は古い関数を呼び出す新しい関数で上書きできます。do_this()do

function do_this(response) { ... }

(function()
{
    var previous=do_this;
    do_this=function(response) { previous(response); do_this_as_well(); }
})();
于 2012-10-15T20:23:18.000 に答える
1

交換

success: do(response)

success: function(response) { do(response); do_this_as_well(); }
于 2012-10-15T19:55:52.463 に答える