異步與回調(diào)

異步代碼的特點:書寫順序與執(zhí)行順序不同。
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)

上面代碼的書寫順序是1->2->3,但執(zhí)行順序是1->3->2。中間的sonsole.log(2)就是異步執(zhí)行的?!敬a的書寫順序和執(zhí)行順序可以不同噠~】

什么是異步?

先看看什么是同步:一定要等任務(wù)執(zhí)行完了,得到結(jié)果,才執(zhí)行下一個任務(wù)。
function taskSync = function(){
return '同步任務(wù)的返回值;
}

var result = taskSync() //result就是同步任務(wù)的結(jié)果
otherTask() //執(zhí)行下一個任務(wù)
異步:不等任務(wù)執(zhí)行完,直接執(zhí)行下一個任務(wù)。
function taskAsync = function(){
var result = setTimeout(function(){
console.log('異步任務(wù)的結(jié)果')
},3000)
return result
}

var result = taskAsync() //result不是異步任務(wù)的結(jié)果,而是一個timer id
otherTask() //立即執(zhí)行其他任務(wù),不等異步任務(wù)結(jié)束
我們異步執(zhí)行的結(jié)果,而是一個timer id,通過回調(diào)可以得到異步結(jié)果:
function taskAsync = function(callback){
var result = setTimeout(function(){
callback('異步任務(wù)的結(jié)果')
},3000)
return result
}

taskAsync(function callback(result){
consolr.log(result) //三秒鐘后,這個callback函數(shù)會被執(zhí)行
})
otherTask() //立即執(zhí)行

所以【回調(diào)】經(jīng)常用于獲取【異步任務(wù)】的結(jié)果

什么是回調(diào)

A "callback" is any function that is called by another function which takes the first function as a parameter.

在一個函數(shù)中調(diào)用另外一個函數(shù)就是callback

function callback(){
alert("I am in the callback!");
}
function work(func){
alert("I am calling the callback!");
func();
}
work(callback);

回調(diào)函數(shù)在什么場景有用?

我要在特定的時候執(zhí)行一個任務(wù),至于是什么時候我自己都不知道。比如某一時間到了或者某一時間發(fā)生或者某一中斷觸發(fā)。

回調(diào)函數(shù)怎么起作用?

把我要執(zhí)行的這個任務(wù)寫成一個函數(shù),將這個函數(shù)和某一時間或者某時間或者中斷簡歷關(guān)聯(lián)。當這個關(guān)聯(lián)完成的時候,這個函數(shù)華麗的從普通函數(shù)變身成為回調(diào)函數(shù)。

回調(diào)函數(shù)什么時候執(zhí)行?

當該回調(diào)函數(shù)關(guān)心的那個時間或者時間或者中斷觸發(fā)的時候,毀掉函數(shù)將被執(zhí)行。一般是觸發(fā)這個時間、時間或中斷的程序主體(通常是個函數(shù)或者對象)觀察到有一個關(guān)注這個東東的回調(diào)函數(shù)的時候,這個主體負責調(diào)用這個回調(diào)函數(shù)。

回調(diào)函數(shù)有什么好處?

最大的好處就是你的程序變成異步了。也就是你不必再調(diào)用這個函數(shù)的時候一直等待這個時間的到達、事件的觸發(fā)或中斷的發(fā)生(萬一一直不發(fā)生,你的程序會怎樣?)。在此期間你可以做別的事情。當回調(diào)函數(shù)被執(zhí)行時,你的程序重新得到執(zhí)行的機會,此時你可以繼續(xù)做必要的事情了。

回調(diào)函數(shù)有什么問題嗎?

既然有人問,當然就會有點問題,一個是學習成本比普通函數(shù)高,需要有一定的抽象思維能力,需要對應(yīng)場景的理解。
另一個是回調(diào)函數(shù)很多情況下會附帶有跨線程操作甚至于跨進程的操作,這些都是異步帶來的成本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容