6

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

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

因此,如果应用函数上有回调,那么这可以按我的意愿工作。IE

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() 方法添加回调?

4

1 回答 1

3

确保您调用的每个函数都返回一个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而不是创建新的延迟对象。

于 2012-08-29T18:47:22.290 回答