有没有办法解雇JQuery。当一个延迟函数列表中的一个完成时?

时间:2015-03-22 18:45:32

标签: jquery jquery-deferred

我想使用ajax构建一个伪队列 然后我想一次发出五个电话。

伪代码看起来像:

For each item in list as ajaxN{
FuncToRun.push(ajaxN);
If(count(FuncToRun)==5){
    .when (FuncToRun).onefinishes{
        FuncToRun.pop(success Func)
    }
}
}

这可能吗?

1 个答案:

答案 0 :(得分:0)

这听起来像你想要jQuery.Callbacks

但是,Callbacks对象不提供length属性,因此您需要设计一些机制来监视队列中的函数数量,并在达到阈值(5)时触发它。

例如,您可以使用少量自定义方法和属性将Callbacks对象包装在一个小命名空间中。

var FunctionList = (function() {
    var list = $.Callbacks(),
        length = 0,
        threshold = 5;
    function add(fn) {
        if(fn  && $.isFunction(fn)) {
            list.add(fn);
            if(++length >= threshold) {
                list.fire().empty();
                length = 0;
            }
        }
        else {
            throw new TypeError("FunctionList.add() must be passed a function");
        }
    }
    function getLength(x) { return length; }
    function setThreshold(x) { threshold = x; }
    function getThreshold() { return threshold; }
    return {
        add: add,
        getLength: getLength,
        setThreshold: setThreshold,
        getThreshold: getThreshold
    };
})();

正如所写,FunctionList非常基本,符合问题的最低要求。可以进一步公开更多的Callbacks API(例如,标志,.disable().fireWith().has().lock().remove())。您还可以将命名空间重构为构造函数,允许同时使用多个FunctionList

如何填充FunctionList取决于您。可以肯定地调用FunctionList.add(...)来响应AJAX的成功,这就是你想要的。