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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于async 中return 和 return await 的差异

發(fā)布時(shí)間:2024/8/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于async 中return 和 return await 的差异 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 小七平時(shí)在使用ES2017的 async功能經(jīng)常會(huì)有如下:

const bluebird = require('bluebird');async function doSomething() {await bluebird.delay(1000);throw new Error('ttt'); }(async function() {return doSomething();// 關(guān)注點(diǎn) })().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');});

小七在調(diào)用doSomething的時(shí)候直接使用 `return doSomething()` ,而不是用 `return await doSomething()`。

因?yàn)樗鼈兊膱?zhí)行和結(jié)果都是一樣的。在大部分情況下,這種方式是正確的,而且代碼也比較簡潔。

但事實(shí)上在執(zhí)行的時(shí)候是有些差異的,我們看下下面的例子。

(async function() {try {return doSomething();// 關(guān)注點(diǎn),這里我們省略了await 產(chǎn)生了更我們?cè)O(shè)想不太一樣的結(jié)果} catch (err) {console.log('do something ignore');} })().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');}); //輸出 :fail

小七這里原本的設(shè)想是 在調(diào)用doSomething的時(shí)候,如果有什么錯(cuò)誤的話,忽略錯(cuò)誤,正常返回。

但是結(jié)果確實(shí)拋出了錯(cuò)誤,被最后面的catch捕獲。輸出了fail。

于是調(diào)整了下代碼:

const bluebird = require('bluebird');async function doSomething() {await bluebird.delay(1000);throw new Error('ttt'); }(async function() {try {return await doSomething();// 關(guān)注點(diǎn),這里恢復(fù)了省略掉的 await} catch (err) {console.log('do something ignore');} })().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');}); //輸出 : //do something ignore //ok

把 await 恢復(fù)回來就正常了。

這里主要的原因就在于小七對(duì)async語法糖原理的誤解,小七以為在async函數(shù)中使用return的時(shí)候和return await是一樣的,是因?yàn)閞eturn 隱含了await的功能。然而并非如此,async中的return 只是簡單的返回一個(gè)promise,所以return 在使用的時(shí)候并沒有任何拋錯(cuò),try catch 自然就沒法獲得該錯(cuò)誤。而返回的promise被后面的.catch方法捕獲到錯(cuò)誤。

而如果使用? return await doSomething() 的時(shí)候,等價(jià)于 先await了doSomething返回的promise,如果有reject,則會(huì)直接傳給cacth block 處理。

?

總結(jié),async函數(shù)中的return 并沒有黑魔法,在大部分情況下也不需要黑魔法,因?yàn)閍sync方法的結(jié)果也是一個(gè)promise,所以返回一個(gè)promise是等價(jià)的。

但我們還是要理解它的實(shí)現(xiàn)原理。

因?yàn)樵赼sync 中 try catch 語法糖的原理是處理同步拋出的錯(cuò)誤和await產(chǎn)生的reject,所以,我們不能省略掉await的調(diào)用。

轉(zhuǎn)載于:https://www.cnblogs.com/chianquan/p/9419089.html

總結(jié)

以上是生活随笔為你收集整理的关于async 中return 和 return await 的差异的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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