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