1. 程式人生 > >如何寫JavaScript中的callback回撥函式

如何寫JavaScript中的callback回撥函式

 如何寫回調函式? 

如果自己在寫一個方法或函式,你有可能會遇到需要一個回撥函式。下面就是一個簡單的常見回撥函式例子:

function mySandwich(param1, param2, callback) {  
    alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);  
    callback();  
}  

//呼叫該方法函式  
mySandwich('ham', 'cheese', function() {  
    alert('Finished eating my sandwich.');  
});  

我們有一個叫mySandwich的函式,它接受三個引數。第三個引數就是回撥函式。當執行這個方法的時候,它會彈出
一個對話方塊,然後才執行回撥函式。注意這裡第三個引數是一段函式宣告,這段宣告在mySandwich裡面被執行。
這個引數就是回撥函式。
這個回撥函式是定義在第三個引數被傳入的,而且裡面有一個alert來告訴這個函式被執行了。

讓回撥函式成為可選? 

有一件事也許大家都知道,就是JQuery中的回撥函式都是可選的,這就意味著如果一個方法接受回撥函式,
當我們不傳值給這個回撥函式,它應該不會報錯。但是在我們的下面例子裡,如果沒有傳參:

function mySandwich(param1, param2, callback) {  
    alert(
'Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2); callback(); } //呼叫該方法函式 mySandwich('ham', 'cheese');

控制檯會報錯:“undefined is not a function” 。

為了讓它不報錯就有如下程式碼

function mySandwich(param1, param2, callback) {  
    alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);  
    
if (callback) { callback(); }   //此處的程式碼還可以用下面的方法表示   //callback && callback(); } //呼叫該方法函式 mySandwich('ham', 'cheese');

 

現在我們檢測了回撥函式是否傳入了,就不會報錯了

讓回撥函式必須是一個Function?

如果你想讓第三個引數無論如何都要傳一個Functon,可以按下方法實現:

function mySandwich(param1, param2, callback) {  
    alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);  
    if (callback && typeof(callback) === "function") {  
        callback();  
    }  
}  

//呼叫該方法函式  
mySandwich('ham', 'cheese', 'vegetables');  

注意這裡用到typeof運算子,來確保傳入值是一個方法,如果不是就會拋異常。

對於延時的注意

儘管回撥函式總是最後被執行,但這不總是這樣的。舉個例子,如果含有回撥函式裡有一個非同步的方法呼叫(AJAX or an animation),這時候回撥會在非同步方法呼叫後執行,但也可能在非同步方法返回之前返回。

下面就是一個JQuery animate例子:

function mySandwich(param1, param2, callback) {  
    alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);  
    
    $('#sandwich').animate({  
        opacity: 0  
    }, 5000, function() {  
        // Animation complete.  
    });  
    
    if (callback && typeof(callback) === "function") {  
        callback();  
    }  
}  

//呼叫該方法函式  
mySandwich('ham', 'cheese', function() {   
    alert('Finished eating my sandwich.');  
}); 

儘管回撥在非同步函式呼叫之後執行,但是在非同步函式返回之前,回撥函式就已經結束了。為了解決這種問題,我建議把回撥
函式放入animate的回撥函式裡面。雖然這不能覆蓋所有的方法,但是回撥函式最基本的意義就在於最後執行。

 

參考原文:

https://www.cnblogs.com/Alex--Yang/p/3579432.html