javascript
学JS的心路历程 -非同步执行
JS是單線程的語言,也就是說同一時間只會執行一行程序,所以如果一段程序執行過久就會造成阻塞(blocking)的現象,必須等到它結束后才能執行下一段程序。
舉個例子來說,如果我們今天要買便當,但是老板說要十分鐘才會好,那難道我們這十分鐘內都不能做任何事情嗎?
?
當然不是,JS本身有非同步執行的功能,也是就說我們會先跟這個函式說,你先到旁邊繼續跑,好了在「回來呼叫」我,我先繼續跑其他程序。
?
有沒有看到熟悉的關鍵字「回來呼叫」,沒錯非同步執行基本上都是利用callback達成。
?
舉個例子來說,我們今天想要某個函式兩秒后在執行,可以這樣寫:
?
function funA(){
console.log(“funA”);
}
function funB(){
console.log(“funB”);
}
setTimeout(funA,2000);
funB();
//funB
//funA
但是callback作非同步會發現有一個問題,假設我們今天要:
?
監聽一個按鈕
點擊后延遲一秒
向API發送請求(wowgoldfine)
btn.addEventListener(“click”,function(){
setTimeout(function(){
var oReqSec = new XMLHttpRequest();
var url = 'https://devche.com/api/speech/data';
oReqSec.addEventListener(“load”,functiion(){
if(this.resp onseText){
console.log('success');
}
});
oReqSec.open(“GET”,url);
?
oReq.send();
},1000);
})
有注意到,那恐怖的巢狀結構了嗎?這個我們通常稱為回呼地獄(callback hell)。
但是其可怕之處并不是在于巢狀結構,而是在于如果其中一個callback出了問題,不論是自己還是別人都難以debug。
?
這個例子或許比較不好懂,那我們換一個簡單的來看:
?
doA(function(){
doB()
doC(function(){
doD(function(){
doE();
})
})
})
當今天里面有個非同步函式出問題的話,有辦法在短時間內找到嗎?
肯定是沒有辦法的吧!
?
所以很多人都會拿這張波動拳圖片來戲稱回呼地獄
?
那到底要怎么解決這個問題呢?
JS在ES6時候提出了Promise語法,雖然底層還是用callback,但卻大大解決了這個回呼地獄的問題。
至于怎么做?我們會在明天一一解析。(yfxj.net)
轉載于:https://www.cnblogs.com/lannyQ-Q/p/9973095.html
總結
以上是生活随笔為你收集整理的学JS的心路历程 -非同步执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换卢布要去哪个银行
- 下一篇: Jmeter工具笔记-Jmeter+in