自定义函数中的回调函数

时间:2012-11-16 17:09:17

标签: javascript jquery

有没有办法在另一个完成后调用自定义函数。很多jquery都包含一种回调方式,比如动画完成时你可以将另一个函数作为最后一个参数。但无论如何要将function1(params, function1(){alert('2');})或其他东西串在一起?老实说,我不知道它会是什么样子。

谢谢

5 个答案:

答案 0 :(得分:5)

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

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

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

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

function1(params, yourCallback);

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

function function1(args, callback) {
    //Some code
    if (callback) {
        callback();
    }
}

答案 1 :(得分: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
});

答案 2 :(得分:0)

function doSomething(arg1, callback){
    // bla bla bla
    callback();
}

答案 3 :(得分: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);

答案 4 :(得分:0)

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

在jQuery中,promises使用when() and then()实现。

requirejs也是一个很好的起点。