一個函數(shù)的作用是完成某一部分的任務(wù),
一個十分耗時的任務(wù),可以讓程序等待這個任務(wù)執(zhí)行完成,獲得返回值然后程序繼續(xù)執(zhí)行,這種叫做同步執(zhí)行。也可讓后臺默默的先接收下這個任務(wù),當(dāng)前的程序繼續(xù)往下執(zhí)行,等后臺執(zhí)行完成這個任務(wù),通過某種方式把處理結(jié)果發(fā)送給當(dāng)前的程序,這種叫做異步執(zhí)行。通信的方式可以是信號量,事件,回調(diào),輪詢等。比如一個 Ajax任務(wù)需要 10s 鐘:
var data = syncAjax(URL); // 同步Ajax console.log('sync return !'); asyncAjax(URL/*其他必要的參數(shù),暫略*/); console.log('async return !')
同步的方式執(zhí)行syncAjax 直到 10s 之后這句才會執(zhí)行完成,把 Ajax 的數(shù)據(jù)賦值給data。所以10s 之后才會執(zhí)行 console.log('sync return !');。這種方式在 JS 不太好,因為JS是單線程,一直在這里等待 10s ,那么將會后很長時間整個瀏覽器沒有響應(yīng),所以不可取。當(dāng)然 nodejs 里面也提供了很多同步的函數(shù)。
對于異步執(zhí)行的asyncAjax,這一句立即執(zhí)行完畢,所以會立即輸出console.log('async return !'),可是由于Ajax 還沒有完成,所以不能把ajax 的數(shù)據(jù)返回給當(dāng)前執(zhí)行的程序(因為系統(tǒng)還沒有獲得服務(wù)器發(fā)送回來的值)。等到服務(wù)器返回數(shù)據(jù)了,需要用某種方式通知當(dāng)前的程序,回調(diào)函數(shù)就是一種。比如
function processData(data){} asyncAjax(URL,processData); console.log('async return !')
當(dāng)后臺獲得Ajax的數(shù)據(jù)data,系統(tǒng)調(diào)用回調(diào)函數(shù)processData,其中第一個參數(shù)是服務(wù)器返回的數(shù)據(jù)data,這樣當(dāng)前的程序就可以通過processData處理 ajax 返回的數(shù)據(jù)了。
注意: 這里的processData做為asnycAjax的參數(shù), 那么 processData就是回調(diào)函數(shù)