亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript體驗異步更好的解決辦法

2024-05-06 16:41:51
字體:
來源:轉載
供稿:網友

一、異步解決方案的進化史
JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案??梢宰匪莸阶钤绲幕卣{函數(ajax老朋友),到Promise(不算新的朋友),再到ES6的Generator(強勁的朋友)。
幾年前我們可能用過一個比較著名的Async.js,但是它沒有擺脫回調函數,并且錯誤處理也是按照“回調函數的第一個參數用來傳遞錯誤”這樣一個約定。而眾所周知的回調地獄仍然是一個比較突出的問題,直到Generator改變了這種異步風格。
但是ES7的async await的出現(碉堡的新朋友),我們可以輕松寫出同步風格的代碼同時又擁有異步機制,可以說是目前最簡單,最優雅,最佳的解決方案了。

二、async await語法
async await語法比較簡單,可以認為是Generator的語法糖,比起星號和yield更具有語義化。下面一個簡單的例子表示1秒之后輸出hello world:

function timeout(ms) { return new Promise((resolve) => {  setTimeout(resolve, ms); });}async function asyncPrint(value, ms) { await timeout(ms); console.log(value)}asyncPrint('hello world', 1000);

await只能用在async函數中,如果用在普通函數就會報錯

await后面跟的是一個Promise對象(當然其它值也可以,但是會包裝成一個立即resolve的Promise,也就沒有意義了)

await會等待Promise的結果返回再繼續執行

await等待的雖然是Promise對象,但是不必寫.then(),直接可以得到返回值,將上面的代碼微調,發現返回值result也是可以輸出hello world:

function timeout(ms) { return new Promise((resolve) => {  setTimeout(_ => {resolve('hello world')}, ms); });}async function asyncPrint(ms) { let result = await timeout(ms); console.log(result)}asyncPrint(1000);

三、async await錯誤處理

前面說了await等待的雖然是Promise對象,但是不必寫.then(),所以其實也不用寫.catch()了,直接用try catch就能捕捉錯誤,這樣可以避免錯誤處理代碼非常冗余和笨重,還是將上面的例子微調:

function timeout(ms) { return new Promise((resolve, reject) => {  setTimeout(_ => {reject('error')}, ms);//reject模擬出錯,返回error });}async function asyncPrint(ms) { try {   console.log('start');   await timeout(ms);//這里返回了錯誤   console.log('end');//所以這句代碼不會被執行了 } catch(err) {   console.log(err); //這里捕捉到錯誤error }}asyncPrint(1000);

如果有多個await,可以一起放在try catch中:

async function main() { try {  const async1 = await firstAsync();  const async2 = await secondAsync();  const async3 = await thirdAsync(); } catch (err) {  console.error(err); }}

四、async await注意點

1). 前面已經說過,await命令后面的Promise對象,運行結果很可能是reject或邏輯報錯,所以最好把await放在try catch代碼塊中。

2). 多個await命令的異步操作,如果不存在依賴關系,讓它們同時觸發。

const async1 = await firstAsync();const async2 = await secondAsync();

上面代碼中,async1和async2如果是兩個獨立的異步操作,這樣寫會比較耗時,因為只有firstAsync完成以后,才會執行secondAsync,完全可以用Promise.all優雅地處理:

let [async1, async2] = await Promise.all([firstAsync(), secondAsync()]);

3). await只能用在async函數之中,如果用在普通函數就會報錯:

async function main() { let docs = [{}, {}, {}]; //報錯 await is only valid in async function docs.forEach(function (doc) {  await post(doc);  console.log('main'); });}function post(){ return new Promise((resolve) => {  setTimeout(resolve, 1000); });}

在forEach內部方法加上async就可以了:

async function main() { let docs = [{}, {}, {}]; docs.forEach(async function (doc) {  await post(doc);  console.log('main'); });}function post(){ return new Promise((resolve) => {  setTimeout(resolve, 1000); });}

但是你會發現3個main是同時輸出的,這就說明post是并發執行的,而不是繼發執行,改成for就可以解決問題,3個main是分別相隔1秒輸出:

async function main() { let docs = [{}, {}, {}]; for (let doc of docs) {  await post(doc);  console.log('main'); }}function post(){ return new Promise((resolve) => {  setTimeout(resolve, 1000); });}

總之,用了async await之后整個人神清氣爽,可以用非常簡潔和優雅的代碼實現各種花式異步操作,并且在業務邏輯復雜的情況下可以不用陷入回調地獄中。不敢說這一定是終極的解決方案,但確實是目前最優雅的解決方案!

 

注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精选在线观看| 欧美激情视频在线| 欧美电影在线观看完整版| 久久精品国产免费观看| 欧美激情视频免费观看| 亚洲天堂第一页| 97人洗澡人人免费公开视频碰碰碰| 精品日本美女福利在线观看| 91干在线观看| 青青a在线精品免费观看| 成人免费网站在线观看| 黑人狂躁日本妞一区二区三区| 亚洲欧洲国产伦综合| 欧美激情第6页| 欧美午夜电影在线| 91精品在线影院| 亚洲在线免费看| 欧美性理论片在线观看片免费| 亚洲一区二区三区久久| 97超碰国产精品女人人人爽| 欧美黑人巨大精品一区二区| 91精品久久久久久久| 欧美日韩国产一区在线| 国内精品模特av私拍在线观看| 91亚洲精品久久久| 欧美裸体男粗大视频在线观看| 久久九九有精品国产23| 中文字幕av日韩| 精品国产乱码久久久久酒店| 亚洲欧洲免费视频| 久久久久久久av| 精品国产自在精品国产浪潮| 久久av红桃一区二区小说| 亚洲白虎美女被爆操| 欧美老少配视频| 在线日韩中文字幕| 日本成人黄色片| 全球成人中文在线| 国产精品极品尤物在线观看| 亚州av一区二区| 福利微拍一区二区| 日韩大陆欧美高清视频区| 欧美成人激情视频| 日韩免费观看高清| 亚洲第一天堂无码专区| 亚洲欧美日韩在线高清直播| www国产精品com| 欧美日本国产在线| 久久69精品久久久久久久电影好| 亚洲人线精品午夜| 亚洲精品久久久久国产| xvideos国产精品| 国产成人福利夜色影视| 欧美一区二区三区免费观看| 欧美天天综合色影久久精品| 欧美日韩成人网| 日韩欧美极品在线观看| 91精品国产综合久久香蕉922| 国产免费一区二区三区在线能观看| 国产精品久久久久久久久久久久| 中文字幕欧美专区| 91在线精品播放| 久久精品久久久久| 亚洲另类激情图| 国产精品pans私拍| 欧美一区二区色| 大胆人体色综合| 日韩精品在线免费| 538国产精品一区二区在线| 色综合亚洲精品激情狠狠| 国产91久久婷婷一区二区| 永久免费精品影视网站| 欧美日韩国产精品一区二区三区四区| 性欧美暴力猛交69hd| 日韩欧美a级成人黄色| 久久精品99久久久香蕉| 欧美又大又粗又长| 中文字幕在线观看日韩| 亚洲人成免费电影| 亚洲无限乱码一二三四麻| 国产成人福利网站| 久久久精品2019中文字幕神马| 中文精品99久久国产香蕉| 成年无码av片在线| 国产不卡一区二区在线播放| 不卡av电影在线观看| 菠萝蜜影院一区二区免费| 国产成人精品999| 成人疯狂猛交xxx| 亚洲国产私拍精品国模在线观看| 久久久久国产视频| 日韩高清免费观看| 久99九色视频在线观看| 91av视频在线免费观看| 福利一区福利二区微拍刺激| 最近2019年好看中文字幕视频| 国产精品视频精品视频| 日韩成人在线视频观看| 久久精品国产99国产精品澳门| 国产成人精品免高潮费视频| 青草青草久热精品视频在线观看| 午夜精品福利在线观看| 国产精品久久久久久av| zzijzzij亚洲日本成熟少妇| 精品偷拍一区二区三区在线看| 欧美国产日韩一区二区在线观看| 成人亚洲综合色就1024| 欧美猛男性生活免费| 国产精品69久久| 国产精品美乳在线观看| 成人免费高清完整版在线观看| 日韩免费观看av| 国产91精品最新在线播放| 日韩中文字幕精品视频| 欧美色视频日本版| 亚洲精品国产精品乱码不99按摩| 精品亚洲一区二区三区| 精品久久久国产| 91久久久亚洲精品| 日韩女优人人人人射在线视频| 欧美性极品xxxx做受| 欧美做受高潮1| 日韩精品黄色网| 久久久久久尹人网香蕉| 国产精品免费久久久| 91美女福利视频高清| 午夜精品在线视频| 91午夜在线播放| www.欧美三级电影.com| 中文字幕在线看视频国产欧美| 青青精品视频播放| 精品福利在线观看| 国产自摸综合网| 伊人亚洲福利一区二区三区| 青青青国产精品一区二区| 日韩精品免费在线播放| 亚洲国产精品va在线看黑人动漫| 亚洲精品福利视频| 亚州国产精品久久久| 久久噜噜噜精品国产亚洲综合| 韩国v欧美v日本v亚洲| 久久在线视频在线| 4438全国亚洲精品在线观看视频| 欧美日韩国产综合视频在线观看中文| 国产剧情日韩欧美| 国产精品精品久久久| 国产亚洲精品成人av久久ww| 2020欧美日韩在线视频| 亚洲第一在线视频| 日韩欧美亚洲国产一区| 久久国产加勒比精品无码| 尤物精品国产第一福利三区| 亚洲电影天堂av| 午夜精品久久久久久99热| 中文字幕日韩在线观看| 亚洲视频在线观看网站| 亚洲一区二区三区久久| 91久久国产精品91久久性色| 97视频在线观看成人| 九色91av视频| 国产99久久精品一区二区 夜夜躁日日躁| 久久久999精品| 欧美精品videos性欧美| 精品中文字幕在线2019|