2012-07-14 80 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