• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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體驗異步更好的解決辦法分享

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

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

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

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

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

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

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲精品宾馆在线精品酒店| 久久久久人妻精品一区二区三区| 国产小呦泬泬99精品| 久久精品欧美日韩精品| 国产精品自产拍高潮在线观看| 久久99精品久久久久久久不卡| 下载天堂国产AV成人无码精品网站| 亚洲国产精品久久66| 国产网红无码精品视频| 亚洲欧洲成人精品香蕉网| 国产欧美在线观看精品一区二区 | 亚洲精品国产品国语在线| 国产欧美精品一区二区色综合| 精品亚洲一区二区| 国产精品9999久久久久| 日韩精品中文字幕无码一区| 久久这里有精品视频| 国产精品自在欧美一区| 你懂的国产精品| 国产成人精品视频播放| 99久久99久久久精品齐齐| 精品无码AV一区二区三区不卡 | 国产精品亚洲一区二区在线观看| 精品久久久久久综合日本| 国产成人精品2021| 国产成人精品日本亚洲网站 | 久久精品亚洲精品国产色婷| 尤物TV国产精品看片在线| 久久乐国产精品亚洲综合| 国产精品偷窥熟女精品视频| 国产精品一区12p| 国产区精品福利在线观看精品| 白浆都出来了视频国产精品| 国产在视频线精品视频二代| 99re8这里有精品热视频免费| 成人区人妻精品一区二区不卡网站 | 国产精品高清2021在线| 56prom精品视频在放免费| 四虎影视国产精品永久在线 | 久久精品国产99国产精偷| 久久福利青草精品资源站免费|