2011-03-13 115 views
4

我對JavaScript很陌生,需要在我的java腳本函數中使用回調函數。我不知道如何使用回調函數。下面是我的代碼:如何在JavaScript函數中使用回調函數

function SelectedFeature() { 
// Here is my code call_Method1(); 
call_Method2(); 
} 

在上述功能的問題是,call_method2()開始call_Method1()執行之前結束它的執行。爲了解決這個問題,有人告訴我使用回調函數。現在如何在我的SelectedFeature()函數中使用回調函數?請使用代碼示例進行說明。

我在call_method1()中發出異步請求。我需要call_Method2()應在完成執行call_method1()後調用。但在我的情況下,在call_method1()完成其執行之前呼叫call_method2()。現在我該如何解決這個問題?

+1

我不認爲call_Method2();開始beforre call_Method1()結束。我很確定(它一定是)call_Method1()會正確返回。正如你所說的,問題是異步調用IN method1。爲了解決這個問題,需要查看call_Method1()的代碼;要知道異步調用的外觀以及如何使用回調。 – Chris 2011-03-13 12:23:45

回答

0

你用什麼來做異步調用?你是自己編寫代碼還是使用類似JQuery的庫?

你可以簡單地把一個布爾說,「工作」,你設置爲真,方法1開始,當它結束時回到假。那麼你可以讓method2在工作正常的時候等待。

+0

此方法是否阻止整個線程的執行? – a20 2015-10-02 09:42:20

7

你必須重構call_method1()接受和執行的回調後,執行完畢:

call_method1(call_method2); 

function call_method1(callback) { 
    // ... 
    // do asynchronous stuff, when the response is processed, call 
    if(typeof callback === 'function') { 
     callback(); 
    } 
    // ... 
} 

函數是一等公民,所以由他們的名字引用它們,你可以像任何其他值一樣傳遞它們。

如果您發佈call_method1的代碼,我們可以提供更好的幫助。

+0

我會添加一個if語句來檢查typeof回調=='函數'。只是爲了安全。 – yoavmatchulsky 2011-03-13 12:29:33

+0

@yoavmatchulsky:好點...我只是懶惰;)...將添加它。 – 2011-03-13 12:32:55

+0

您可以使用==代替嚴格===,因爲typeof將始終返回一個字符串。 :D – yoavmatchulsky 2011-03-13 13:20:36

0

這個問題已經由Felix在上面回答了。受到他的回答以及我在當前項目中遇到的問題的啓發,我寫了一個小題目,其中有一門課程,增加了一點額外的安全性。

綜上所述,您可以像傳遞變量一樣傳遞迴調函數。然後接收器將作爲一個函數觸發它。

myCoolFunction: function(data) { 
    // Do some thing with response 
} 

$.get('/some/cool/url', myCoolFunction); 

在上面$.get電話回myCoolFunction與參數data一旦數據被取出

如果myCoolFunciton是一個變量,會發生什麼。那麼這取決於接收器如何處理輸入。

只是要小心,我有一個CoffeeScript類(和它的JavaScript編譯),將做一些安全檢查。

它並沒有做任何魔術,檢查它是否是一個函數並返回,如果沒有返回一個空函數,這樣就可以減少JS錯誤的可能性。 https://gist.github.com/ziyan-junaideen/8717925