2

另一个功能完成后触发功能的最佳方法是什么?

目前我有 6 个函数调用 DOM 加载,如下所示:

$(document).ready(function(){
    func1();
    func2();
    func3();
    func4();
    func5();
    func6();
});

function func1(){
    do some stuff
}

function func2(){
    do some stuff
}

function func3(){
    do some stuff
}

function func4(){
    do some stuff
}

function func5(){
    do some stuff
}

function func6(){
    do some stuff
}

但我希望他们一个接一个地开火。我该怎么做?

提前致谢

4

3 回答 3

0

你可以写一个队列函数。对于函数队列,您可以使用数组:

var fn1 = function() {}, 
fn2 = function() {},
MyQ = [];

//add functions to array
MyQ.push(fn1);
MyQ.push(fn2);

//remove and call the first item of an array
(MyQ.shift())();

如果您想将函数与范围和参数一起使用,您可以包装函数,例如:

MyFnWithParam = function(fn, scope, params){
    scope = scope || window;
    params = params || [];
    return function() {fn.apply(scope, params)};
};

var fn1 = MyFnWithParam(fn, this, params),
fn2 = MyFnWithParam(fn, this, params),
MyQ = [];

MyQ.push(fn1);
MyQ.push(fn2);

while (MyQ.length > 0) {
    (MyQ.shift())();   
}
于 2013-11-06T13:27:23.520 回答
0

尝试使用callbackslike,

$(document).ready(function(){
    func1(func2);
});

function func1(callback){
    do some stuff
    callback('func2');
}

function func2(callback){
    do some stuff
    callback('func3');
}

function func3(callback){
    do some stuff
    callback('func4');
}

function func4(callback){
    do some stuff
    callback('func5');
}

function func5(callback){
    do some stuff
    callback('func6');
}

function func6(callback){
    do some stuff
}

阅读回调函数-javascript

你可以参考Is there a better way to do callback chaining in javascript? 为了chained callbacks

function func1(){
    do some stuff
    _next();
}

function func2(){
    do some stuff
    _next();
}

function func3(){
    do some stuff
    _next();
}

function func4(){
    do some stuff
    _next();
}

function func5(){
    do some stuff
    _next();
}

function func6(){
    do some stuff
    _next();
}
function chainCallbacks() {

    var _this = this;
    var _counter = 0;
    var _callbacks = arguments;

    var _next = function() {
        _counter++;
        if(_counter < _callbacks.length) {
            _callbacks[_counter].apply(_this);
        }
    };

    _this._next = _next;

    return function() {
        if(_callbacks.length > 0) {
            _callbacks[0].apply(_this);
        }
    };
}

var queue = chainCallbacks(func1, func2, func3,func4,func5,func6);
queue();
于 2013-11-06T13:00:14.527 回答
0

您编写它的方式对于同步代码是正确的。但是,根据您的评论,听起来您正在触发异步运行的外部请求。在这种情况下发生的情况是,function1 可能会触发一些访问 Sharepoint 的代码,然后在此之后完成函数 1 中的其余代码......然后直接流入 function2 而无需等待查看 Sharepoint 请求会发生什么。

我首选的处理方法是使用来自异步操作的回调。例如,从 Sharepoint 中提取数据后,您将调用其他函数(我们将其称为 Sharepoint_callback1)。添加对该函数的调用:

$(document).ready(function(){
    func1();
});

function func1(){
    do some stuff that calls Sharepoint, which after complete calls Sharepoint_callback1
}

function func2(){
    do some stuff
}

function Sharepoint_callback1() {
    do some stuff
    func2();
}

还有其他方法可以做到这一点。JQuery 为其几乎所有操作提供回调处理程序,但基本上都归结为与上述相同的事情。

如果我误解了这个问题,我深表歉意;请发布更多详细信息,我将修改我的答案。

于 2013-11-06T13:17:18.483 回答