在jQuery中松散耦合自定义回调

时间:2011-11-07 14:21:37

标签: jquery jquery-callback loose-coupling

我想知道是否存在允许在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');

3 个答案:

答案 0 :(得分: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/>');
    }
  ]
});

答案 1 :(得分:1)

jqXHR对象是所有AJAX查询的返回值,它支持done方法,该方法允许您绑定在请求完成时执行的任意函数;

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

这是因为AJAX模块在jQuery 1.5中被重写以使用Deferred interface,这保证了在回调触发之前或之后绑定的处理程序的执行。

编辑:解释我的评论

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);

答案 2 :(得分:0)

不确定它是否需要耦合松散,但在成功回调中,您始终可以将data对象发送到另一个函数。但我不确定这是怎么解开的。在一种情况下,您从成功回调中调用functionA()functionB();在另一种情况下,您将数据发送到utilityFunction()functionA()的{​​{1}}。

在任何一种情况下,您都可以使用一个或多个条件来运行functionB() functionA()(或其他任何功能)。但同样,这可以在成功回调或效用函数中完成,所以我仍然不确定解耦将在何处发生。

问题的核心是:你得到functionB(),大概你想要对这些数据采取行动,或者至少根据响应运行逻辑。它就像它将要获得的那样分离,从那里它只是你想要如何构建它的问题。