異步代碼的特點:書寫順序與執(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ù)很多情況下會附帶有跨線程操作甚至于跨進程的操作,這些都是異步帶來的成本。