【问题标题】:How can I add a callback to the .apply() method?如何向 .apply() 方法添加回调?
【发布时间】:2012-08-29 18:28:17
【问题描述】:

在我的代码中,我有一个函数调用数组。我遍历这些调用并使用 .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() 方法添加回调?

【问题讨论】:

  • 除非您知道所有函数都遵循的参数模式,否则无法做您想做的事情。
  • @Pointy - 如果我将所有参数都放在一个数组中,又名args,为什么还需要一个参数模式?
  • 问题是没有办法判断一个函数是否是异步的并且设计为接受一个回调函数参数(或两个这样的参数,或更多)。您不能让系统“等待”一个函数及其异步后续完成。因此,如果您知道所有函数(例如)都将回调作为最后一个参数,那么您可以解决一些问题。
  • @Pointy 如果被调用函数遵循通用接口(例如 Promise),那么您可以让系统“等待”异步调用完成。
  • element 会发生什么样的事情?只是更改它的属性,或者用一个全新的对象替换它?

标签: javascript jquery callback


【解决方案1】:

确保您调用的每个函数都返回一个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 调用,您可以直接返回 $.ajaxjqXHR 结果,而不是创建新的延迟对象。

【讨论】:

  • 如果我传递给calls 变量的某些函数不是我的,我将如何添加$.Deferred() 对象?我可以将它包装在另一个函数中,还是有可能?
  • 是的,你可以包装函数,但是不知何故你仍然需要resolve 承诺,这必须在异步回调中完成。
  • 所以即使我把它包起来,我还是回到@Pointy 提出的原始问题?也就是说,如果一个函数还没有回调,那么我想要的就是不可能的?
  • @Aust 我从来没有见过一个没有有“完成回调”的异步函数......如果没有它,它们将毫无意义。你有例子吗?
  • 是的,我没想到。我只是想理解。 :)
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多