如何在.apply()方法中添加回调?

时间:2012-08-29 18:28:18

标签: javascript jquery callback

在我的代码中,我有一个函数调用数组。我遍历这些调用并使用.apply()来调用它们。问题是如果新函数的调用需要任何时间,则循环将.apply()并在前一个函数完成之前调用下一个函数。 >。<这是一个例子:

function someFunc(element, calls){
  if(calls.length){
    fn = calls[0];
    calls.shift();
    fn.apply(element, args);
    someFunc(element, calls);
  }
}

因此,如果在apply函数上有回调,那么这可以按照我想要的方式工作。即。

function someFunc(element, calls){
  if(calls.length){
    fn = calls[0];
    calls.shift();
    fn.apply(element, args, function(){
      someFunc(element, calls);
    });
  }
}

我还有一个关于在回调函数中调用someFunc的问题。我的calls数组中的函数会影响我的element变量。所以我想确保在它被改变后它被传递给回调中的someFunc,所以下一个函数也可以操作它。有时我只是对this上下文感到困惑。 :)

如果有帮助,我正在使用jQuery。我知道如何向jQuery方法添加回调,但是当我处理本机JavaScript代码时,我不知道如何做到这一点。 如何向.apply()方法添加回调?

1 个答案:

答案 0 :(得分:2)

确保您调用的每个函数都返回promise。然后,您可以“继续”继续列表中的下一个功能,“等待”该承诺被“解决”:

function someFunc(element, calls) {
    if (calls.length) {
        var fn = calls.shift();
        fn.apply(element, args).done(function(el) {  // what's args?
            el = el || element;   // default to previous element if necessary
            someFunc(el, calls);
        });
    }
}

每个函数看起来像:

function myFunc1(el) {
    var def = $.Deferred();

    // do something async, and "resolve" the deferred object in the async callback
    ...(function() {
        def.resolve(el);  // this "el" will get passed to the next function
    });

    return def.promise();
}

如果异步任务是AJAX调用,您只需直接返回jqXHR $.ajax结果,而不是创建新的延迟对象。