日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

学JS的心路历程 -非同步执行

發(fā)布時間:2025/5/22 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学JS的心路历程 -非同步执行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JS是單線程的語言,也就是說同一時間只會執(zhí)行一行程序,所以如果一段程序執(zhí)行過久就會造成阻塞(blocking)的現(xiàn)象,必須等到它結(jié)束后才能執(zhí)行下一段程序。

舉個例子來說,如果我們今天要買便當,但是老板說要十分鐘才會好,那難道我們這十分鐘內(nèi)都不能做任何事情嗎?

?

當然不是,JS本身有非同步執(zhí)行的功能,也是就說我們會先跟這個函式說,你先到旁邊繼續(xù)跑,好了在「回來呼叫」我,我先繼續(xù)跑其他程序。

?

有沒有看到熟悉的關鍵字「回來呼叫」,沒錯非同步執(zhí)行基本上都是利用callback達成。

?

舉個例子來說,我們今天想要某個函式兩秒后在執(zhí)行,可以這樣寫:

?

function funA(){

console.log(“funA”);

}

function funB(){

console.log(“funB”);

}

setTimeout(funA,2000);

funB();

//funB

//funA

但是callback作非同步會發(fā)現(xiàn)有一個問題,假設我們今天要:

?

監(jiān)聽一個按鈕

點擊后延遲一秒

向API發(fā)送請求(wowgoldfine)

btn.addEventListener(“click”,function(){

setTimeout(function(){

var oReqSec = new XMLHttpRequest();

var url = 'https://devche.com/api/speech/data';

oReqSec.addEventListener(“l(fā)oad”,functiion(){

if(this.resp onseText){

console.log('success');

}

});

oReqSec.open(“GET”,url);

?

oReq.send();

},1000);

})

有注意到,那恐怖的巢狀結(jié)構(gòu)了嗎?這個我們通常稱為回呼地獄(callback hell)。

但是其可怕之處并不是在于巢狀結(jié)構(gòu),而是在于如果其中一個callback出了問題,不論是自己還是別人都難以debug。

?

這個例子或許比較不好懂,那我們換一個簡單的來看:

?

doA(function(){

doB()

doC(function(){

doD(function(){

doE();

})

})

})

當今天里面有個非同步函式出問題的話,有辦法在短時間內(nèi)找到嗎?

肯定是沒有辦法的吧!

?

所以很多人都會拿這張波動拳圖片來戲稱回呼地獄

?


那到底要怎么解決這個問題呢?

JS在ES6時候提出了Promise語法,雖然底層還是用callback,但卻大大解決了這個回呼地獄的問題。

至于怎么做?我們會在明天一一解析。(yfxj.net)

轉(zhuǎn)載于:https://www.cnblogs.com/lannyQ-Q/p/9973095.html

總結(jié)

以上是生活随笔為你收集整理的学JS的心路历程 -非同步执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。