jQuery Ajax回调挂钩系统

时间:2015-09-08 19:16:38

标签: jquery ajax callback hook deferred

单击按钮时,将进行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调用之后“挂钩”/访问该数据。我如何设置它(也让任何数量的其他脚本也这样做)?

2 个答案:

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