有没有办法在另一个完成后调用自定义函数。许多 jquery 包含一种回调方法,例如当动画完成时,您可以给它另一个函数作为最后一个参数。但是有什么可以串起来function1(params, function1(){alert('2');})
的吗?老实说,我不知道它会是什么样子。
谢谢
有没有办法在另一个完成后调用自定义函数。许多 jquery 包含一种回调方法,例如当动画完成时,您可以给它另一个函数作为最后一个参数。但是有什么可以串起来function1(params, function1(){alert('2');})
的吗?老实说,我不知道它会是什么样子。
谢谢
您可以使用以下内容创建函数指针:
var yourCallback = function() {
alert('2');
}
您可以将其视为包含函数本身(而不是其返回值)的对象。由于它是一个对象,因此您可以将其传递给其他函数。
然后将其作为参数传递给您正在调用的函数(不要使用 调用它()
,因为这会传递它的返回值):
function1(params, yourCallback);
最后,在 function1 中,在需要时调用您的回调:
function function1(args, callback) {
//Some code
if (callback) {
callback();
}
}
从技术上讲,您要求的模式是:
function myFunctionNeedsACallback(param1, callback) {
//do stuff with param1
if(typeof callback === "function"){
callback.call(yourThisParam, anyOtherParams);
}
}
虽然这是一个有用的模式......过度使用会导致丑陋、不可测试和不可维护的代码。谨慎使用。
您的示例可以正常工作:
myFunctionNeedsACallback(param, function() { alert('2'); });
//will alert 2 after running the rest of the contents of the function
编辑
为了解决托马斯的情况:
function ajaxCall1(){
return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/);
}
function ajaxCall2(){
return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/);
}
function ajaxCall3(){
return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/);
}
$.when(ajaxCall1(), ajaxCall2(), ajaxCall3()).then(function(results1, results2, results3) {
//do stuff with all 3 results without "nesting" things
});
function doSomething(arg1, callback){
// bla bla bla
callback();
}
你会像这样构建你的函数:
function one(x, y, z, callback) {
// do operations here
callback();
}
然后,由于函数是对象,你可以通过回调参数传入一个函数,IE:
one(1, 2, 3, function(){alert('hello');});
或者
var func = function() { alert('hello'); };
one(1, 2, 3, func);
或者
function func() {
alert('hello');
}
one(1, 2, 3, func);
虽然回调很方便,但过度使用会导致代码丑陋且无法维护。除了其他答案中显示的标准回调之外,您可能还想查看其他模式,例如 deferred/promises 和 AOP。
在 jQuery 中,promise 是通过when() 和 then()实现的。
requirejs也是一个很好的起点。