4

有没有办法在另一个完成后调用自定义函数。许多 jquery 包含一种回调方法,例如当动画完成时,您可以给它另一个函数作为最后一个参数。但是有什么可以串起来function1(params, function1(){alert('2');})的吗?老实说,我不知道它会是什么样子。

谢谢

4

5 回答 5

5

您可以使用以下内容创建函数指针:

var yourCallback = function() {
    alert('2');
}

您可以将其视为包含函数本身(而不是其返回值)的对象。由于它是一个对象,因此您可以将其传递给其他函数。

然后将其作为参数传递给您正在调用的函数(不要使用 调用它(),因为这会传递它的返回值):

function1(params, yourCallback);

最后,在 function1 中,在需要时调用您的回调:

function function1(args, callback) {
    //Some code
    if (callback) {
        callback();
    }
}
于 2012-11-16T17:12:16.797 回答
0

从技术上讲,您要求的模式是:

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
});
于 2012-11-16T17:12:13.410 回答
0
function doSomething(arg1, callback){
    // bla bla bla
    callback();
}
于 2012-11-16T17:12:17.110 回答
0

你会像这样构建你的函数:

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);
于 2012-11-16T17:17:25.357 回答
0

虽然回调很方便,但过度使用会导致代码丑陋且无法维护。除了其他答案中显示的标准回调之外,您可能还想查看其他模式,例如 deferred/promises 和 AOP。

在 jQuery 中,promise 是通过when() 和 then()实现的。

requirejs也是一个很好的起点。

于 2012-11-16T17:21:30.537 回答