JavaScript 的異步方案

異步: 一段不連續(xù)的程序流徐钠,在未來不確定的事件發(fā)生的事情堰酿。
問題編程表述 在一件異步事件 A 發(fā)生后執(zhí)行程序 B
發(fā)展:異步事件+回調(diào) -> 三方庫(消息驅(qū)動(dòng),Promise祖很,二次編譯) -> 標(biāo)準(zhǔn)Promise對(duì)象愿险,Generator函數(shù)颇蜡, async函數(shù)

// Promise
const promise = new Promise(function(resolve, reject) {
  // 異步操作
  const A  = '異步事件'
  if ( A/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
promise.then(function(value) {
  // success
console.log('B')
}, function(error) {
  // failure
});

// Generator
function* GeneratorAB() {
  yield 'A';
  yield 'B';
  return 'ending';
}
const hw = GeneratorAB();
hw.next()
hw.next()

//async
function timeoutA(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncAB(value, ms) {
  await timeoutA(ms);
  console.log(value);
}

asyncAB('B', 3000);


Promise,Generator,async三者的關(guān)系:
實(shí)際運(yùn)用過程中,使用 Promise 包裝異步事件辆亏,使用 async 函數(shù)控制流程风秤。
async 是 Generator 函數(shù)的語法糖


Promise 對(duì)象

  • Promise對(duì)象是一個(gè)構(gòu)造函數(shù),用來生成Promise實(shí)例扮叨。
    Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù)缤弦,該函數(shù)的兩個(gè)參數(shù)分別是resolve和reject。
    Promise彻磁,簡單說就是一個(gè)容器碍沐,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果。從語法上說兵迅,Promise 是一個(gè)對(duì)象抢韭,從它可以獲取異步操作的消息薪贫。Promise 提供統(tǒng)一的 API恍箭,各種異步操作都可以用同樣的方法進(jìn)行處理。

  • resolve 函數(shù)的作用是瞧省,將Promise對(duì)象的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸?pending 變?yōu)?resolved)扯夭,在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果鞍匾,作為參數(shù)傳遞出去交洗。

  • reject 函數(shù)的作用是,將Promise對(duì)象的狀態(tài)從“未完成”變?yōu)椤笆 保磸?pending 變?yōu)?rejected)橡淑,在異步操作失敗時(shí)調(diào)用构拳,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去梁棠。

  • then 方法可以接受兩個(gè)回調(diào)函數(shù)作為參數(shù)置森。第一個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)閞esolved時(shí)調(diào)用,第二個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)閞ejected時(shí)調(diào)用符糊。其中凫海,第二個(gè)函數(shù)是可選的,不一定要提供男娄。這兩個(gè)函數(shù)都接受Promise對(duì)象傳出的值作為參數(shù)行贪。

  • catch方法 用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)漾稀。


Generator 函數(shù)

  • Generator 函數(shù)是一個(gè)狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)建瘫。
    Generator 函數(shù)是一個(gè)普通函數(shù)崭捍,但是有兩個(gè)特征。一是啰脚,function關(guān)鍵字與函數(shù)名之間有一個(gè)星號(hào)缕贡;二是,函數(shù)體內(nèi)部使用yield表達(dá)式拣播,定義不同的內(nèi)部狀態(tài)晾咪。
    調(diào)用 Generator 函數(shù),返回一個(gè)遍歷器對(duì)象贮配,代表 Generator 函數(shù)的內(nèi)部指針谍倦。以后,每次調(diào)用遍歷器對(duì)象的next方法泪勒,就會(huì)返回一個(gè)有著value和done兩個(gè)屬性的對(duì)象昼蛀。value屬性表示當(dāng)前的內(nèi)部狀態(tài)的值,是yield表達(dá)式后面那個(gè)表達(dá)式的值圆存;done屬性是一個(gè)布爾值叼旋,表示是否遍歷結(jié)束。

  • Generator 函數(shù)返回的遍歷器對(duì)象沦辙,只有調(diào)用next方法才會(huì)遍歷下一個(gè)內(nèi)部狀態(tài)夫植,yield表達(dá)式就是暫停標(biāo)志

  • next 方法運(yùn)行邏輯:
    (1)遇到y(tǒng)ield表達(dá)式油讯,就暫停執(zhí)行后面的操作详民,并將緊跟在yield后面的那個(gè)表達(dá)式的值,作為返回的對(duì)象的value屬性值陌兑。
    (2)下一次調(diào)用next方法時(shí)沈跨,再繼續(xù)往下執(zhí)行,直到遇到下一個(gè)yield表達(dá)式兔综。
    (3)如果沒有再遇到新的yield表達(dá)式饿凛,就一直運(yùn)行到函數(shù)結(jié)束,直到return語句為止软驰,并將return語句后面的表達(dá)式的值涧窒,作為返回的對(duì)象的value屬性值。
    (4)如果該函數(shù)沒有return語句碌宴,則返回的對(duì)象的value屬性值為undefined杀狡。


async 函數(shù)

  • async 函數(shù)是 Generator 函數(shù)的語法糖。
    async函數(shù)就是將 Generator 函數(shù)的星號(hào)()替換成async贰镣,將yield替換成await*呜象,僅此而已膳凝。
  • async 內(nèi)置執(zhí)行器,執(zhí)行 async函數(shù) 直接輸出最終結(jié)果。
  • 返回值是 Promise 對(duì)象

參考:阮一峰-ES6入門

問題: Javascript 是單線程恭陡。setTimeout(),發(fā)生了什么蹬音,原理是怎樣的?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末休玩,一起剝皮案震驚了整個(gè)濱河市著淆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拴疤,老刑警劉巖永部,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呐矾,居然都是意外死亡苔埋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蜒犯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來组橄,“玉大人,你說我怎么就攤上這事罚随∮窆ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵淘菩,是天一觀的道長遵班。 經(jīng)常有香客問我,道長瞄勾,這世上最難降的妖魔是什么费奸? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮进陡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘微服。我一直安慰自己趾疚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布以蕴。 她就那樣靜靜地躺著糙麦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丛肮。 梳的紋絲不亂的頭發(fā)上赡磅,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音宝与,去河邊找鬼焚廊。 笑死冶匹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咆瘟。 我是一名探鬼主播嚼隘,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袒餐!你這毒婦竟也來了飞蛹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤灸眼,失蹤者是張志新(化名)和其女友劉穎卧檐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焰宣,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泄隔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宛徊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛嬉。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闸天,靈堂內(nèi)的尸體忽然破棺而出暖呕,到底是詐尸還是另有隱情,我是刑警寧澤苞氮,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布湾揽,位于F島的核電站,受9級(jí)特大地震影響笼吟,放射性物質(zhì)發(fā)生泄漏库物。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一贷帮、第九天 我趴在偏房一處隱蔽的房頂上張望戚揭。 院中可真熱鬧,春花似錦撵枢、人聲如沸民晒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜必。三九已至,卻和暖如春沃但,著一層夾襖步出監(jiān)牢的瞬間磁滚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工宵晚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垂攘,地道東北人维雇。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像搜贤,于是被迫代替她去往敵國和親谆沃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語言太重要仪芒。Javascript語言的執(zhí)行環(huán)境是“單線程”的唁影,如果沒有異步編程,根本...
    呼呼哥閱讀 7,311評(píng)論 5 22
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持掂名,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券据沈,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,378評(píng)論 9 19
  • 特別說明饺蔑,為便于查閱锌介,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 686評(píng)論 0 1
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便猾警。 async 函數(shù)是...
    huilegezai閱讀 1,259評(píng)論 0 6
  • 弄懂js異步 講異步之前孔祸,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,711評(píng)論 0 5