国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 20:06:59
文檔

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

JavaScript體驗異步更好的解決辦法分享:本文主要給大家講述了JavaScript體驗異步更好的解決辦法,有這方面需要的朋友跟著學習參考下吧,希望能幫助到大家。一、異步解決方案的進化史JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調函數(shù)(ajax老朋
推薦度:
導讀JavaScript體驗異步更好的解決辦法分享:本文主要給大家講述了JavaScript體驗異步更好的解決辦法,有這方面需要的朋友跟著學習參考下吧,希望能幫助到大家。一、異步解決方案的進化史JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案??梢宰匪莸阶钤绲幕卣{函數(shù)(ajax老朋

本文主要給大家講述了JavaScript體驗異步更好的解決辦法,有這方面需要的朋友跟著學習參考下吧,希望能幫助到大家。

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

二、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函數(shù)中,如果用在普通函數(shù)就會報錯

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

await會等待Promise的結果返回再繼續(xù)執(zhí)行

await等待的雖然是Promise對象,但是不必寫.then(),直接可以得到返回值,將上面的代碼微調,發(fā)現(xiàn)返回值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');//所以這句代碼不會被執(zhí)行了
 } 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). 前面已經(jīng)說過,await命令后面的Promise對象,運行結果很可能是reject或邏輯報錯,所以最好把await放在try catch代碼塊中。

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

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

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

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

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

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);
 });
}

但是你會發(fā)現(xiàn)3個main是同時輸出的,這就說明post是并發(fā)執(zhí)行的,而不是繼發(fā)執(zhí)行,改成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之后整個人神清氣爽,可以用非常簡潔和優(yōu)雅的代碼實現(xiàn)各種花式異步操作,并且在業(yè)務邏輯復雜的情況下可以不用陷入回調地獄中。不敢說這一定是終極的解決方案,但確實是目前最優(yōu)雅的解決方案!

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

JavaScript體驗異步更好的解決辦法分享:本文主要給大家講述了JavaScript體驗異步更好的解決辦法,有這方面需要的朋友跟著學習參考下吧,希望能幫助到大家。一、異步解決方案的進化史JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調函數(shù)(ajax老朋
推薦度:
標簽: js 體驗 解決方案
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美精品一区二区在线观看 | 欧美电影一区二区 | 日韩中文在线视频 | 亚洲欧美一区二区三区不卡 | 亚洲va乱码一区二区三区 | 欧美高清视频在线观看 | 亚洲一区精品伊人久久 | 日本亚洲国产精品久久 | 亚欧成人毛片一区二区三区四区 | 91大神在线观看精品一区 | 国产日韩一区二区三区在线观看 | 国产免费网址 | 91chinese在线 | 国产美女视频黄a视频免费全过程 | 国产在线视频一区 | 日韩精品一区二区三区国语自制 | 精品久久久久久综合日本 | 天天摸日日干 | heyzo国产| 亚洲欧美日本在线观看 | 中文字幕综合 | 精品一区二区三区五区六区七区 | 全部费免一级毛片不收费 | 欧美日韩精品在线 | 国产精品久久久久久久久免费 | 在线播放国产精品 | 久久福利资源网站免费看 | 国产成人久久精品二区三区 | 99久久精品免费 | 日韩在线第三页 | 亚洲男同在线观看 | 国产欧美另类第一页 | 中文字幕日韩一区二区三区不卡 | 亚洲页码 | 91资源在线播放 | 免费成人毛片 | 韩国精品欧美一区二区三区 | 精品亚洲一区二区 | 亚洲第二页 | 精品久久成人 | 日韩成人免费视频 |