如何寫JavaScript中的callback回撥函式
阿新 • • 發佈:2018-11-05
如何寫回調函式?
如果自己在寫一個方法或函式,你有可能會遇到需要一個回撥函式。下面就是一個簡單的常見回撥函式例子:
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