我想知道是否存在允许在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');
答案 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()
,大概你想要对这些数据采取行动,或者至少根据响应运行逻辑。它就像它将要获得的那样分离,从那里它只是你想要如何构建它的问题。