python异步回调实现原理_JS基础——异步回调
前言
一個剛入前端的小菜,雖然以前看到過關于回調的文章,但是呢,理解起來有點費勁啊。當時的腦海里就一個概念。
回調:大多出現在Ajax請求,用于處理收到的請求結果。
嘿嘿,當時真的就是這一個想法啊。現在真的入這行,而且這個概念也非常重要,用的地方太多太多,是時候把它撿起來好好理解一番。
當然,本文適合菜鳥,因為我是以一個菜鳥的思維去理解的。
回調概念
理解一個新東西,很有必須去理解下它的概念,因為這是最簡潔明了,前人總結的。
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.
中文意思:回調是一個函數被作為一個參數傳遞到另一個函數里,在那個函數執行完后再執行。
有點繞,好,咱們說大白話。就是 B函數被作為參數傳遞到A函數里,在A函數執行完后再執行B。
下面咱們看看代碼怎么實現回調。
function A(callback){
console.log("I am A");
callback(); //調用該函數
}
function B(){
console.log("I am B");
}
A(B);
這應該是最最簡單的回調了,我想大家應該明白回調的釋義了吧。
當然,這么簡單的同步回調代碼是不會用的,現實中用都是相對比較復雜帶傳參。
回調函數和異步
一開始我被回調和異步有點搞暈了。還以為回調就一定是異步的呢。
其實不然,相信上面的A,B函數的例子我們已經明白,回調并不一定就是異步。他們自己并沒有直接關系。
下面我們可以理解下 同步回調和異步回調(同步異步我就不單獨講了,概念很簡單)。
同步回調
就是上面的A B函數例子,它們就是同步的回調。
異步回調
因為js是單線程的,但是有很多情況的執行步驟(ajax請求遠程數據,IO等)是非常耗時的,如果一直單線程的堵塞下去會導致程序的等待時間過長頁面失去響應,影響用戶體驗了。
如何去解決這個問題呢,我們可以這么想。耗時的我們都扔給異步去做,做好了再通知下我們做完了,我們拿到數據繼續往下走。
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true); //第三個參數決定是否采用異步的方式
xhr.send(data);
xhr.onreadystatechange = function(){
if(xhr.readystate === 4 && xhr.status === 200){
///xxxx
}
}
上面是一個代碼,瀏覽器在發起一個ajax請求,會單開一個線程去發起http請求,這樣的話就能把這個耗時的過程單獨去自己跑了,在這個線程的請求過程中,readystate 的值會有個變化的過程,每一次變化就觸發一次onreadystatechange 函數,進行判斷是否正確拿到返回結果。
異步編程的實現
就我目前知道兩種 回調函數 和 事件監聽 ,其實看了阮神的 異步編程的文章 和下面的評論之后得出的理解。下面咱們就看看這兩種異步編程的方式吧。
回調函數
假定有三個函數
f1()
f2()
f3()
但是,f1執行很耗時,而 f2需要在f1執行完之后執行。
為了不影響 f3的執行,我們可以把f2寫成f1的回調函數。
//最原始的寫法-同步寫法
f1(); //耗時很長,嚴重堵塞
f2();
f3(); //導致f3執行受到影響
//改進版-異步寫法
function f1(callback){
setTimeout(function () {
// f1的任務代碼
callback();
}, 1000);
}
f1(f2); //
f3();
上面的寫法是利用 setTimeOut把f1的邏輯包括起來,實現javascript中的異步編程。這樣的話,f1異步了,不再堵塞f3的執行。
順道說下,js是單線程的,這里所謂的異步也是偽異步,并不是開了多線程的異步。它是什么原理呢,其實是任務棧,setTimeOut方法的原理是根據后面的定時時間,過了這個定時時間后,將f1加入任務棧,注意僅僅是加入任務棧,并不是放進去就執行,而是根據任務棧里的任務數量來確定的。
事件監聽
這里我直接用阮神的例子,通過事件觸發操作,就是類似于咱們點擊事件里的處理邏輯。
同樣f1 , f2兩個函數。
f1()
f2()
f1 我們給它加一個事件,事件觸發 f2 函數。
function f1(){
setTimeOut(function(){
f1.trigger('click');
})
}
f1.on('click' , f2);
另外多說點,這上面的兩種方式都是 js 中的偽異步,而 ajax的異步是底層多線程函數異步。
寫在最后
由于時間問題,后續的理解會再補上,再理理思路。另外如果有錯誤,也請各位前輩給予指正,感激不盡。
參考文獻
感謝上面4篇文章的作者的辛勤付出,看完很有收獲。
總結
以上是生活随笔為你收集整理的python异步回调实现原理_JS基础——异步回调的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的read_csv_pyth
- 下一篇: python快速学_python快速学习