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

Aus*_*ust 6 javascript jquery callback

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

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

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

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

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

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

Aln*_*tak 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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

每个函数看起来都是这样的:

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();
}
Run Code Online (Sandbox Code Playgroud)

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