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

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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體驗異步更好的解決辦法,有這方面需要的朋友跟著學(xué)習參考下吧,希望能幫助到大家。一、異步解決方案的進化史JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調(diào)函數(shù)(ajax老朋
推薦度:
導(dǎo)讀JavaScript體驗異步更好的解決辦法分享:本文主要給大家講述了JavaScript體驗異步更好的解決辦法,有這方面需要的朋友跟著學(xué)習參考下吧,希望能幫助到大家。一、異步解決方案的進化史JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調(diào)函數(shù)(ajax老朋

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

一、異步解決方案的進化史
JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調(diào)函數(shù)(ajax老朋友),到Promise(不算新的朋友),再到ES6的Generator(強勁的朋友)。
幾年前我們可能用過一個比較著名的Async.js,但是它沒有擺脫回調(diào)函數(shù),并且錯誤處理也是按照“回調(diào)函數(shù)的第一個參數(shù)用來傳遞錯誤”這樣一個約定。而眾所周知的回調(diào)地獄仍然是一個比較突出的問題,直到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的結(jié)果返回再繼續(xù)執(zhí)行

await等待的雖然是Promise對象,但是不必寫.then(),直接可以得到返回值,將上面的代碼微調(diào),發(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就能捕捉錯誤,這樣可以避免錯誤處理代碼非常冗余和笨重,還是將上面的例子微調(diào):

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對象,運行結(jié)果很可能是reject或邏輯報錯,所以最好把await放在try catch代碼塊中。

2). 多個await命令的異步操作,如果不存在依賴關(guān)系,讓它們同時觸發(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內(nèi)部方法加上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è)務(wù)邏輯復(fù)雜的情況下可以不用陷入回調(diào)地獄中。不敢說這一定是終極的解決方案,但確實是目前最優(yōu)雅的解決方案!

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

文檔

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

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

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产va精品免费观看 | 国产第一页在线观看 | 国产黄色视屏 | 欧美日韩国产一区二区三区播放 | 免费一级 一片一毛片 | 亚洲成a人一区二区三区 | 91精品国产免费久久久久久 | 四虎精品成人a在线观看 | 欧美日韩国产中文字幕 | 欧美不卡一区 | 亚洲一区日韩二区欧美三区 | 一本一道 | 视频一区二区三区欧美日韩 | 国产精品第二页 | 成人国产在线看不卡 | 亚洲成人免费 | 久久久久久久亚洲精品 | 在线免费观看一区二区三区 | 免费黄色网址在线观看 | 国产精品欧美韩国日本久久 | 欧美亚洲综合一区 | 国产一级理论免费版 | 天天爽夜夜爽一区二区三区 | 亚洲国产成人久久一区www妖精 | 国产亚洲一欧美一区二区三区 | 啪啪网站免费观看 | 国产亚洲一区二区三区在线 | 亚洲欧美日韩在线 | 国产成人综合一区精品 | 一级毛片真人不卡免费播 | 成人a免费α片在线视频网站 | 日韩成人在线电影 | 亚洲精品乱码久久久久久 | 欧美在线播放视频 | 欧美 日韩 国产 色 欧美 日韩 中文 | 在线亚洲电影 | 亚洲一区影院 | 国产成人无精品久久久 | 在线国产高清 | 91一区二区三区四区五区 | 日韩欧美亚 |