2012-07-14 152 views
0

我有2个函数。函数的JavaScript/jQuery回调函数

function f1() { 
    $.ajax(..., success: function(response) { 
     // some code executed whenever request is completed. 
    } 
} 

function f2() { 
    // my code 
} 

我需要一个接一个地调用这些函数。

f1() // waiting until ajax request in the function is complete. 
f2() 

我试过$.when().then(),但它似乎没有工作。

回答

2

$.ajax调用返回其用于跟踪呼叫的进度$.Deferred实例 - 这就是你需要从f1函数返回的内容。然后,您可以使用.then().done()

编辑回应评论

如果你想内f1调用回调以及外部您可以返回.pipe方法的结果。

function f1() { 
    return $.ajax(/*...*/).pipe(function() { 
     //local 'done' handler 
    }); 
} 

function f2(resultFromF1Handler) { 
    //... 
} 

f1().done(f2); 
+0

但是,该工作仍然有点过早执行。我需要在ajax请求之后调用f2,并在f1中执行它的回调。 – aemdy 2012-07-14 08:48:33

+0

@Hvandracas在'f1'中看到了我的编辑 - 带回调的更新示例。 – 2012-07-14 08:55:28

0

我建议在作为f1()成功执行的匿名函数中调用f2()。

这样做有问题吗?

+0

但是,这将意味着,'f1'需要了解f2'的'。通过使用'$ .Deferred',这两个函数可以在单独的文件或单独的库中,并且仍然可以像OP期望的那样工作 – 2012-07-14 08:43:18

1
function f1(onsuccess) 
{ 
    $.ajax(
    { 
     success: function(r) 
     { 
      // some code 
      onsuccess(r); 
     } 
    }); 
} 

function f2() 
{ 
    // my code 
} 

f1(f2); 
+0

这可以工作,但不像使用'$ .Deferred'那么灵活:如果要连接2个'success'处理程序,该怎么办?还是'失败'处理程序? – 2012-07-14 08:47:43

+0

@Steve,真实但可行...'function success(){f2(); f3();} f1(success,fail);' – 2012-07-14 08:49:11

+0

+1如果你还不知道如何使用deferreds,这是从'f1()'调用'f2()'最简单的方法,不需要'f1 '知道'f2'的任何细节。它所做的就是设计f1(),以便在ajax调用成功后支持调用任意函数。 – jfriend00 2012-07-14 08:56:58