1

jQueryでコールバックの緩い結合を可能にするデザインパターン/フレームワークが存在するかどうか疑問に思いました。

基本的に、コールバック関数で必要となる設定を取得するajax呼び出しがあります。ajax呼び出しが完了した後に起動したい関数がいくつかありますが、次のようなことは避けたいと思います。

$.getJSON('/webservice/config', function(data) {
    functionA();
    functionB();
}

ゆるく結合してほしい。誰かがこれがどのようにポップ可能であるかについての考えを持っていますか?

ありがとう、Gearoid。

解決

これが私が最後に使用したものです:

function initConfig(callbacks) {

    $.getJSON('/webservices/config', function(data) {       

        $.each(data.config, function(key, value) { 
          config[data.config[key].paramName] = data.config[key].paramValue; 
        });

    }).done(function() {
        //callbacks
        callbacks.forEach(function(callback) {
           if (eval('typeof ' + callback) == 'function') {
            window[callback]();
        });
    });
}

その後、元の関数に任意の数のコールバック関数を渡すことができ、それらは順番に実行されるため、私のコードは非常に緩く結合されています。

initConfig('setLocationData', 'setUserData');
4

3 に答える 3

1

$ .ajax関数は、複数の成功コールバックを受け入れることができます。http://api.jquery.com/jQuery.ajax/からの引用:

jQuery 1.5以降、成功設定は関数の配列を受け入れることができます。各関数は順番に呼び出されます。

簡単な例:( http://jsfiddle.net/JhTDW/を参照)

$.ajax({
  url: '/echo/json/',
  success: [
    function(data) {
      document.write('First callback: ' + data + '<br/>');
    },
    function(data) {
      document.write('Second callback: ' + data + '<br/>');
    }
  ]
});
于 2011-11-07T14:28:20.263 に答える
1

すべてのjqXHRAJAXクエリの戻り値であるオブジェクトはdone、リクエストの完了時に実行される任意の関数をバインドできるようにするメソッドをサポートします。

jQuery.getJSON('/foo.json').done(function () {
 // One success handler
}).done(function () {
 // Another success handler
});

これは、AJAXモジュールがjQuery 1.5で、コールバックの起動前または起動後にバインドされたハンドラーの実行を保証するDeferredインターフェイスを使用するように書き直されたためです。

編集:私のコメントを説明する

function initConfig() {
    return $.getJSON('/webservices/config', function(data) {       
        $.each(data.config, function(key, value) { 
          config[data.config[key].paramName] = data.config[key].paramValue; 
        });
    });
}

initConfig().done(setLocationData, setUserData);
于 2011-11-07T14:57:13.763 に答える
0

結合がどれほど緩く必要かはわかりませんが、成功コールバックでは、dataオブジェクトをいつでも別の関数に送信できます。しかし、これがどのように物事を切り離すのかはわかりません。あるケースでは、成功コールバック内から呼び出しfunctionA()ています。functionB()それ以外の場合は、utilityFunction()実行中のデータを送信functionA()しますfunctionB()

functionA() いずれの場合も、または functionB()(またはその他の関数)を実行するための1つ以上の条件を設定できます。しかし、繰り返しになりますが、これは成功コールバックまたはユーティリティ関数のいずれかで実行できるため、デカップリングがどこで発生するかはまだわかりません。

質問の核心はこれです:あなたはdata戻ってきます、そしておそらくあなたはそのデータに基づいて行動するか、少なくとも応答に応じてロジックを実行したいと思います。それはそれが得ようとしているのとほぼ同じくらい分離されており、そこからそれはあなたがそれをどのように構築したいかの問題です。

于 2011-11-07T14:35:45.410 に答える