async&await的一些理解

今天有空看了一下node.js v7.6.0的新特性

分析

①async函數(shù)返回什么

async function func() {
    let res = await Promise.resolve(1);
    console.log('in', res);
    return res;
}
let res = func();
console.log('out', res);

運(yùn)行之前加袋,我以為先打印 in,再輸出 out毅哗,然而我想的并沒有什么卵用听怕。實(shí)際上,async函數(shù)返回一個(gè)一個(gè)promise,而且還是異步的虑绵。也就是說尿瞭,先輸出 out, 然后才是 in翅睛。然后我就想声搁,如果我想要的同步,怎么辦捕发?能不能這樣

let res = await func();

事實(shí)證明疏旨,報(bào)錯(cuò),async和await是孿生兄弟不能分開的扎酷。只能這樣

(async () => {
    let res = await func();
    console.log('out', res);
})();

感覺好麻煩的樣子充石,最外層還要套一個(gè)async。這樣做的后果是,啟動(dòng)的時(shí)候直接從一個(gè)函數(shù)開始骤铃,然后不斷地調(diào)用async函數(shù)拉岁。跟c語(yǔ)言的main函數(shù)一樣的意思。

②async函數(shù)什么時(shí)候返回

還是直接上代碼

async function func() {
    console.log('in-before');
    let res = await Promise.resolve(1);
    console.log('in', res);
    return res;
}

let res = func();
console.log('out', res);

第一感覺: out->in-before->in???
好像會(huì)有人這么認(rèn)為惰爬,結(jié)果呢喊暖?當(dāng)然也是不對(duì)的。正確來說撕瞧,in-before->out->in陵叽。
為什么會(huì)這樣呢?不是說async是異步的嗎丛版?怎么會(huì)先輸出 in-before 的巩掺?
對(duì)于async函數(shù)來說,當(dāng)遇到第一個(gè)await關(guān)鍵字的時(shí)候就已經(jīng)返回了页畦,跟一般函數(shù)里面的 return 一樣胖替。

那么問題來了,如果我有2個(gè)await呢豫缨?

async function func() {
    console.log('in-before');
    let res = await Promise.resolve(1);
    console.log('in1', res);
    let res2 = await Promise.resolve(2);
    console.log('in2', res2);
    return res2;
}

let res = func().then(console.log);
console.log('out', res);

如果說遇到第一個(gè)await已經(jīng)返回一個(gè)promise的話独令,那么,最終 func().then 打印的是什么呢好芭?答案是2燃箭,在輸出 in2后打印 2 。

所以舍败,總結(jié)一下上面的討論招狸。調(diào)用一個(gè)async函數(shù) func 的時(shí)候,遇到第一個(gè)await就直接返回一個(gè)promise了邻薯。只是瓢颅,這個(gè)promise想要繼續(xù)往下走的話,必須要等這個(gè) func 函數(shù)執(zhí)行完之后才能使用弛说。而且這個(gè)promise.then得到的是 func的最終返回值挽懦。結(jié)合上面最后一個(gè)代碼,應(yīng)該不難理解木人。

只是信柿,我覺得有點(diǎn)不可思議,說好的遇到第一個(gè) await 就返回了醒第,為啥最終獲取的確實(shí)最后return返回的值呢渔嚷?不科學(xué)啊3砺P尾 !

別急,客官漠吻,聽我細(xì)說量瓜。看看下面這個(gè)代碼途乃。

function func() {
    console.log('in', 1);
    return Promise.resolve(2).then(() => {
        return 3;
    });
}

func().then(console.log);
console.log('out');

看到這里绍傲,絕大多數(shù)人應(yīng)該能知道正確答案:in->out->3

再次分析

雖然在func函數(shù)遇到了關(guān)鍵字return立刻返回一個(gè)promise,但是如果要使用這個(gè)promise,必須等到func函數(shù)里面的promise先執(zhí)行完。也就是說耍共, func().then得到的是最后的3烫饼。

回頭一看,發(fā)現(xiàn)這兩個(gè)用法其實(shí)是一樣的试读。你有await杠纵,我有return,大家都是直接返回了钩骇。在我看來比藻,await/async只是一個(gè)語(yǔ)法糖而已。在遇到首個(gè)await promise的時(shí)候伊履,實(shí)際就是return了韩容,至于下面那些邏輯款违,是promise鏈里面的東西唐瀑。

await Promise.resolve(1);
await Promise.resolve(2);
console.log(2)
await Promise.resolve(3);
return 4;

上面代碼和下面代碼效果一樣

return Promise.resolve(1)
        .then(() => 2)
        .then(() => {
            console.log(2)
            return Promise.resolve(3);
        })
        .then(() => 4)

好看了,簡(jiǎn)潔了插爹。

總結(jié)

  • 這個(gè)新特性 async/await 和我想象中不太一樣哇哄辣。
  • 返回的是promise(異步),如果不想顯示使用promise赠尾,只能在調(diào)用者的外層加一個(gè)async力穗。
  • 我感覺用起來和 co 用起來很像。
  • 和generator的區(qū)別也不是十分大气嫁。
  • 功能沒啥實(shí)際變化当窗,但是語(yǔ)法看起來簡(jiǎn)潔了。
  • 語(yǔ)法糖寸宵。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崖面,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梯影,更是在濱河造成了極大的恐慌巫员,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲棍,死亡現(xiàn)場(chǎng)離奇詭異简识,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門七扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奢赂,“玉大人,你說我怎么就攤上這事戳寸〕适唬” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵疫鹊,是天一觀的道長(zhǎng)袖瞻。 經(jīng)常有香客問我,道長(zhǎng)拆吆,這世上最難降的妖魔是什么聋迎? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮枣耀,結(jié)果婚禮上霉晕,老公的妹妹穿的比我還像新娘。我一直安慰自己捞奕,他們只是感情好牺堰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颅围,像睡著了一般伟葫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上院促,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天筏养,我揣著相機(jī)與錄音,去河邊找鬼常拓。 笑死渐溶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弄抬。 我是一名探鬼主播茎辐,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掂恕!你這毒婦竟也來了拖陆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竹海,失蹤者是張志新(化名)和其女友劉穎慕蔚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋配,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孔飒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年灌闺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坏瞄。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桂对,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸠匀,到底是詐尸還是另有隱情蕉斜,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布缀棍,位于F島的核電站宅此,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爬范。R本人自食惡果不足惜父腕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望青瀑。 院中可真熱鬧璧亮,春花似錦、人聲如沸斥难。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哑诊。三九已至群扶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搭儒,已是汗流浹背穷当。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工提茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淹禾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓茴扁,卻偏偏與公主長(zhǎng)得像铃岔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峭火,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 異步編程對(duì)JavaScript語(yǔ)言太重要毁习。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的,如果沒有異步編程卖丸,根本...
    呼呼哥閱讀 7,298評(píng)論 5 22
  • 相對(duì)于回調(diào)函數(shù)來說纺且,Promise是一種相對(duì)優(yōu)雅的選擇。那么有沒有更好的方案呢稍浆?答案就是async/await载碌。優(yōu)...
    勇往直前888閱讀 47,136評(píng)論 8 36
  • 簡(jiǎn)單介紹下這幾個(gè)的關(guān)系為方便起見 用以下代碼為例簡(jiǎn)單介紹下這幾個(gè)東西的關(guān)系猜嘱, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,204評(píng)論 1 24
  • 接著上節(jié) condition_varible ,本節(jié)主要介紹future的內(nèi)容嫁艇,練習(xí)代碼地址朗伶。本文參考http:/...
    jorion閱讀 14,760評(píng)論 1 5
  • R:(原文閱讀) 選自《自控力》 I(用自己的話理解原文知識(shí)點(diǎn)) 要想提高自己的自控力,必須提高自己的意志力步咪,提高...
    Renny_xing閱讀 141評(píng)論 1 0