在我的代码中,我有一个函数调用数组。我遍历这些调用并使用.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()方法添加回调?
答案 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
结果,而不是创建新的延迟对象。