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 开始,success 设置可以接受一个函数数组。每个函数都会被依次调用。

简短的例子:(见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

jqXHR对象是所有 AJAX 查询的返回值,它支持一种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()and functionB();在另一种情况下,您将数据发送到utilityFunction()正在运行的functionA()functionB().

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

问题的核心是:你data回来了,大概你想对这些数据采取行动,或者至少根据响应运行逻辑。它几乎是解耦的,从那里开始,这只是你想如何构建它的问题。

于 2011-11-07T14:35:45.410 回答