[JavaScript] 非同步處理技巧 回呼函式 Callback

[JavaScript] 非同步處理技巧  回呼函式 Callback

在前一篇文章: javascript-非同步asynchronus-函式 中,我們介紹了 非同步(Asynchronus) 的觀點了,再來將說明如何使用 回呼函式(callback) 來進行撰寫較易維護的編碼:


編碼如下,下方是一個 AJAX 的範例:

var req = new XMLHttpRequest();

req.open('get','http://skyroxas.tw/aboutme');

req.onload = function(){
  var content = this.responseText;
}

req.send(); //執行連線

上面的範例中,如果我們要在主程式中取得到 this.responseText, 的資料進行操作,是一件非常困難的事情

不只是單單 作用域 上的問題,還有就是你沒有辦法掌握到 連線時間 的長短,如下:

function getData(){
  var req = new XMLHttpRequest();
  req.open('get','http://skyroxas.tw/aboutme');
  req.onload = function(){
    return this.responseText;
  }
  req.send(); //執行連線 
}

console.log(getData()) //undefined

但是如果直接在 onload() 的作用域中,直接對 this.responseText, 的資料進行操作

雖然是可行的,但如果操作的事件一多,很容易 降低編碼的可讀性,與 增加不少後續的維護時間,如下:

function getData(){
  var req = new XMLHttpRequest();
  req.open('get','http://skyroxas.tw/aboutme');
  req.onload = function(){
    //codeing........
    //codeing........
    console.log(this.responseText)
  }
  req.send(); //執行連線 
}
getData();


使用 回呼函式(callback)

我們用 回呼函式(callback)的方式,讓 AJAX 在 取得連線時,在執行一隻另外宣告的函式,如下:

function getData(callback){
  var req = new XMLHttpRequest();
  req.open('get','http://skyroxas.tw/aboutme');
  req.onload = function(){
    callback(this.this.responseText) // 在這邊呼叫另一隻函數,並將取得結果傳入
  }
  req.send();
}
function showData(data){
    //codeing........
    //codeing........
    console.log(data)
}
getData(showData);

使用 回呼函式(callback)的方式,可以解決我上面所說的問題

另外在 ES6 中有另外有提供一種專門用來處理 非同步(Asynchronus) 編程 的物件 Promises , 在後續會進行說明

Facebook 功能: