javascript異步理解

javascript是單線程編程,意思就是javascript引擎一次只能執(zhí)行一個語句宗兼。這樣在出現(xiàn)長時間的請求的話躏鱼,會阻塞主線程,為了不阻塞主線程殷绍,出現(xiàn)了javascript異步的概念染苛。

javascript 同步異步理解:
設想這樣的情景,你現(xiàn)在路過一個炸雞店主到,聞著特別香茶行,你實在抵擋不住炸雞的誘惑,你就走上前登钥,買了一份炸雞畔师。
同步的情況是:你點了一份炸雞,然后你站到跟前等著啥也不干牧牢,炸雞好了之后看锉,你付錢給老板。
異步的情況是:你點了一份炸雞塔鳍,然后老板給你一張?zhí)柎a單伯铣,你把錢付了,玩著手機等轮纫,炸雞好了之后懂傀,老板再叫你。

同步代碼:

const makeChicken = () => {
  console.log('炸雞好了')
}
console.log('我要吃炸雞')
makeChicken()
console.log('給你炸雞錢')
console.log('玩手機')

執(zhí)行結果:

我要吃炸雞
炸雞好了
給你炸雞錢
玩手機

異步代碼:

const makeChicken = () => {
  setTimeout(() => {
    console.log('炸雞好了')
  }, 2000)
}
console.log('我要吃炸雞')
makeChicken()
console.log('給你炸雞錢')
console.log('玩手機')

執(zhí)行結果:

我要吃炸雞
給你炸雞錢
玩手機
炸雞好了

異步實現(xiàn)邏輯:


image.png

事件循環(huán)蜡感、web APIs 和消息隊列不是JavaScript引擎的一部分,它們是瀏覽器端的JavaScript運行環(huán)境或者Nodejs端的JavaScript運行環(huán)境的一部分恃泪。在Nodejs中郑兴,web APIs被C/C++ APIs替代。

當上面的代碼加載在瀏覽器中贝乎,console.log('我要吃炸雞')情连,被推到棧中然后當結束時從棧中被移除。然后览效,makeChicken()觸發(fā)却舀,然后它被推到了棧的頂部虫几。

接下來setTimeOut( )函數(shù)被調用,所以它被推到了棧頂挽拔。setTimeOut( )有兩個參數(shù):一是回調辆脸,二是毫秒數(shù)盏檐。

這個setTimeOut( )方法在web APIs環(huán)境中開始了一個2秒的計時器事镣。此時,setTimeOut( )執(zhí)行完畢并被移出棧掰曾。之后术裸,console.log('給你炸雞錢')倘是,被推到棧里,執(zhí)行完后被移除袭艺。

同時搀崭,計時器到期了,現(xiàn)在這個回調被推到了消息隊列猾编。但是這回調不會被立即執(zhí)行瘤睹,這里就是事件循環(huán)插手的地方。

事件循環(huán)的作用是查看調用棧并確定調用棧是否為空袍镀。 如果調用棧為空默蚌,它會查看消息隊列以查看是否有任何掛起的回調等待執(zhí)行。

在上面的例子中苇羡,消息隊列中有一個回調绸吸,并且此時調用棧已經(jīng)空了。 因此设江,事件循環(huán)將回調推到棧頂部锦茁。

之后, console.log('炸雞好了')被推到棧頂部叉存,執(zhí)行完后從堆棧中彈出码俩。 此時,回調已執(zhí)行完畢歼捏,因此被從棧中移除稿存,程序最終完成。

異步的幾種實現(xiàn):
1)回調函數(shù):
意思就是等到炸雞好了再叫你瞳秽。

function getYourFood() {
  console.log('給你炸雞')
}

function getChicken(callback) {
  console.log('準備制作炸雞')
  setTimeout(() => {
    console.log('炸雞制作完成')
    callback()
  }, 2000)
}

getChicken(getYourFood)

執(zhí)行結果:

我要炸雞
準備制作炸雞
炸雞制作完成
給你炸雞

2)promise
使我們可以主動的去執(zhí)行后面的動作瓣履,而不是把回調函數(shù)給一個方法等在這個方法內部調用。

function makeChicken() {
  return new Promise(((resolve) => {
    console.log('準備制作炸雞')
    setTimeout(() => {
      resolve('炸雞成功')
      console.log('炸雞制作完成')
    }, 2000)
    console.log('炸雞制作中')
  }))
}
function getYourFood() {
  return new Promise(((resolve) => {
    resolve('炸雞好了')
  }))
}
console.log('我要炸雞')
makeChicken().then(() => {
  getYourFood().then((seccess) => {
    console.log(seccess)
  })
})

執(zhí)行結果:

我要炸雞
準備制作炸雞
炸雞制作中
炸雞制作完成
炸雞好了

3)async await
使異步代碼看起來就是同步代碼练俐。我們添加一個關鍵字async讓引擎知道哪個函數(shù)觸發(fā)是異步的并且會返回一個promise袖迎,讓我們使用await。

function makeChicken() {
  return new Promise(((resolve) => {
    console.log('準備制作炸雞')
    setTimeout(() => {
      resolve('炸雞成功')
      console.log('炸雞制作完成')
    }, 2000)
    console.log('炸雞制作中')
  }))
}
function getYourFood() {
  return new Promise(((resolve) => {
    resolve('炸雞好了')
  }))
}
async function OrderChicken() {
  await makeChicken()
  const result = await getYourFood()
  console.log(result)
}
console.log('我要炸雞')
OrderChicken()

運行結果:

我要炸雞
準備制作炸雞
炸雞制作中
炸雞制作完成
炸雞好了

我覺得下面鏈接的有關異步的講解特別好。

參考鏈接:
[譯]理解異步JavaScript-事件循環(huán)https://mbd.baidu.com/newspage/data/landingshare?pageType=1&isBdboxFrom=1&context=%7B%22nid%22%3A%22news_9071904341435333508%22%2C%22sourceFrom%22%3A%22bjh%22%7D

[翻譯]JavaScript異步進化史:Callbacks,Promises,Async/Await 上
https://mbd.baidu.com/newspage/data/landingshare?context=%7B%22nid%22%3A%22news_8754335365643315921%22%2C%22sourceFrom%22%3A%22bjh%22%7D&type=news

[翻譯]JavaScript異步進化史之下篇
https://mbd.baidu.com/newspage/data/landingshare?context=%7B%22nid%22%3A%22news_9356479249406614478%22%2C%22sourceFrom%22%3A%22bjh%22%7D&type=news

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末燕锥,一起剝皮案震驚了整個濱河市辜贵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌归形,老刑警劉巖托慨,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異连霉,居然都是意外死亡榴芳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門跺撼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窟感,“玉大人,你說我怎么就攤上這事歉井∈疗恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵哩至,是天一觀的道長躏嚎。 經(jīng)常有香客問我,道長菩貌,這世上最難降的妖魔是什么卢佣? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮箭阶,結果婚禮上虚茶,老公的妹妹穿的比我還像新娘。我一直安慰自己仇参,他們只是感情好嘹叫,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诈乒,像睡著了一般罩扇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怕磨,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天喂饥,我揣著相機與錄音,去河邊找鬼肠鲫。 笑死仰泻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的滩届。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帜消!你這毒婦竟也來了棠枉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤泡挺,失蹤者是張志新(化名)和其女友劉穎辈讶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娄猫,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贱除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了媳溺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片月幌。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悬蔽,靈堂內的尸體忽然破棺而出扯躺,到底是詐尸還是另有隱情,我是刑警寧澤蝎困,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布录语,位于F島的核電站,受9級特大地震影響禾乘,放射性物質發(fā)生泄漏澎埠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一始藕、第九天 我趴在偏房一處隱蔽的房頂上張望蒲稳。 院中可真熱鬧,春花似錦鳄虱、人聲如沸弟塞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽决记。三九已至,卻和暖如春倍踪,著一層夾襖步出監(jiān)牢的瞬間系宫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工建车, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扩借,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓缤至,卻偏偏與公主長得像潮罪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容