单击按钮时,将进行ajax调用。该按钮提供了一个与ajax一起传递的变量。当它是.done()
并返回数据时,我希望能够“附加”或“挂钩”任意数量的其他函数(可能在其他文件中并可能在此ajax函数之前或之后加载)来访问返回的数据并用它做点什么。从我到目前为止收集到的情况来看,这将是一个延迟/承诺的情况,但我无法在任何地方找到银弹解决方案(希望不使用任何计时器)。
page.html
:
<button data-ajax_action="url/to/action">Button</button>
common.js
:
$(document).on('click','[data-ajax_action]',function(e){
var action = $(this).data('ajax_action');
$.ajax({
url: action,
dataType: 'json'
}).done(function(data){
// do default stuff with data
// somehow provide access to data var to other functions
});
e.preventDefault();
});
现在假设我有另一个在common.js
之前加载的js文件需要在进行ajax调用之后“挂钩”/访问该数据。我如何设置它(也让任何数量的其他脚本也这样做)?
答案 0 :(得分:2)
使用包含要调用的函数数组的全局ajax_hooks
变量。
var ajax_hooks = [];
其他代码可以这样做:
ajax_hooks.push(function(data) { // do something with data }));
在你的.done()
函数中,你会这样做:
ajax_hooks.forEach(function(callback) {
callback(data);
});
答案 1 :(得分:2)
与Barmar的答案一样,但是使用了一个jQuery Callbacks对象,它(从v1.7开始)在概念上类似于Array,但具有更好的控制可能性,用“flags”指定。
将jQuery.Callbacks
个实例分配给全局ajax_callbacks
变量:
var ajax_callbacks = new jQuery.Callbacks( "once memory" );
有关可能的标志的描述,请参阅jQuery文档。 “曾经的记忆”是一个很好的起点。
其他代码可以这样做:
ajax_callbacks.add(function(data) { /* do something with data */ });
在你的.done()
函数中,你会这样做:
ajax_callbacks.fire(data);