1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        "承諾"的終極解決方案

        共 6368字,需瀏覽 13分鐘

         ·

        2021-02-20 12:31

        有一種特殊的語(yǔ)法以一種更舒適的方式處理承諾,稱為“async/await”。它非常容易理解和使用。

        Async functions

        讓我們從async關(guān)鍵字開始。它可以放在函數(shù)前面,像這樣:

        async function f({
          return 1;
        }

        函數(shù)前面的“async”一詞意味著一件簡(jiǎn)單的事情:函數(shù)總是返回promise。其他值自動(dòng)包裝在已解析的承諾中。

        例如,該函數(shù)返回一個(gè)已解析的promise,其結(jié)果為1;讓我們測(cè)試它:

        async function f({
          return 1;
        }

        f().then(alert); // 1

        我們可以顯式地返回一個(gè)promise,它是一樣的:

        async function f({
          return Promise.resolve(1);
        }

        f().then(alert); // 1

        因此,async確保該函數(shù)返回一個(gè)承諾,并將非承諾封裝在其中。很簡(jiǎn)單,對(duì)吧?但不僅如此。還有另一個(gè)關(guān)鍵字await,它只在異步函數(shù)內(nèi)部工作,非常酷。

        Await

        語(yǔ)法:

        // works only inside async functions
        let value = await promise;

        關(guān)鍵字await使JavaScript等待,直到promise解決并返回結(jié)果。

        下面是一個(gè)承諾在1秒內(nèi)解決的例子:

        async function f({

          let promise = new Promise((resolve, reject) => {
            setTimeout(() => resolve("done!"), 1000)
          });

          let result = await promise; // wait until the promise resolves (*)

          alert(result); // "done!"
        }

        f();

        函數(shù)的執(zhí)行“暫?!痹?*)行,當(dāng)promise結(jié)束時(shí)繼續(xù)執(zhí)行,result成為它的結(jié)果。所以上面的代碼顯示“done!”“一秒鐘之內(nèi)。

        讓我們強(qiáng)調(diào)一下:await實(shí)際上是暫停函數(shù)的執(zhí)行,直到promise結(jié)束,然后使用promise結(jié)果繼續(xù)執(zhí)行。這不會(huì)消耗任何CPU資源,因?yàn)镴avaScript引擎可以同時(shí)執(zhí)行其他任務(wù):執(zhí)行其他腳本、處理事件等等。

        這是一種比promise更優(yōu)雅的獲取promise結(jié)果的語(yǔ)法。然后,更容易讀和寫。

        不能在常規(guī)函數(shù)中使用await

        function f({
          let promise = Promise.resolve(1);
          let result = await promise; // Syntax error
        }

        讓我們以承諾鏈接一章中的showAvatar()為例,并使用async/await重寫它:

        我們需要替換。然后調(diào)用await。

        我們也應(yīng)該使函數(shù)異步,以使它們工作。

        async function showAvatar({

          // read our JSON
          let response = await fetch('/article/promise-chaining/user.json');
          let user = await response.json();

          // read github user
          let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
          let githubUser = await githubResponse.json();

          // show the avatar
          let img = document.createElement('img');
          img.src = githubUser.avatar_url;
          img.className = "promise-avatar-example";
          document.body.append(img);

          // wait 3 seconds
          await new Promise((resolve, reject) => setTimeout(resolve, 3000));

          img.remove();

          return githubUser;
        }

        showAvatar();

        await在頂級(jí)代碼中不起作用

        剛剛開始使用await的人往往會(huì)忘記這樣一個(gè)事實(shí):我們不能在頂級(jí)代碼中使用await。例如,這將不起作用:

        // syntax error in top-level code
        let response = await fetch('/article/promise-chaining/user.json');
        let user = await response.json();

        但是我們可以把它包裝成一個(gè)匿名異步函數(shù),像這樣:

        (async () => {
          let response = await fetch('/article/promise-chaining/user.json');
          let user = await response.json();
        })();

        等待接受“thenables”

        像承諾。然后,await允許我們使用thenable對(duì)象(帶有可調(diào)用then方法的對(duì)象)。其理念是,第三方對(duì)象可能不是承諾,但與承諾兼容:如果它支持.那么,與await一起使用它就足夠了。

        這是一個(gè)演示的Thenable類;下面的await接受它的實(shí)例:

        class Thenable {
          constructor(num) {
            this.num = num;
          }
          then(resolve, reject) {
            alert(resolve);
            // resolve with this.num*2 after 1000ms
            setTimeout(() => resolve(this.num * 2), 1000); // (*)
          }
        }

        async function f({
          // waits for 1 second, then result becomes 2
          let result = await new Thenable(1);
          alert(result);
        }

        f();

        如果await獲得一個(gè)帶有.then的非Promise對(duì)象,它將調(diào)用該方法,并提供內(nèi)置函數(shù)resolve和reject作為參數(shù)(就像它對(duì)常規(guī)Promise executor所做的那樣)。然后await等待,直到其中一個(gè)被調(diào)用(在上面的例子中,它發(fā)生在行(*)中),然后繼續(xù)處理結(jié)果。

        異步類方法

        要聲明一個(gè)異步類方法,只需在它的前面加上async:

        class Waiter {
          async wait() {
            return await Promise.resolve(1);
          }
        }

        new Waiter()
          .wait()
          .then(alert); // 1

        錯(cuò)誤處理

        如果promise正常解析,則await promise返回結(jié)果。但是在拒絕的情況下,它拋出錯(cuò)誤,就像在那一行有一個(gè)throw語(yǔ)句一樣。

        這段代碼:

        async function f({
          await Promise.reject(new Error("Whoops!"));
        }

        和這個(gè)是一樣的:

        async function f({
          throw new Error("Whoops!");
        }

        在實(shí)際情況下,承諾可能需要一段時(shí)間才會(huì)被拒絕。在這種情況下,在await拋出錯(cuò)誤之前會(huì)有延遲。

        我們可以使用try..catch,和普通的throw一樣:

        async function f({

          try {
            let response = await fetch('http://no-such-url');
          } catch(err) {
            alert(err); // TypeError: failed to fetch
          }
        }

        f();

        在出現(xiàn)錯(cuò)誤的情況下,控件跳轉(zhuǎn)到catch塊。我們也可以換行:

        async function f({

          try {
            let response = await fetch('/no-user-here');
            let user = await response.json();
          } catch(err) {
            // catches errors both in fetch and response.json
            alert(err);
          }
        }

        f();

        如果我們不 try…catch,然后異步函數(shù)f()調(diào)用生成的承諾將被拒絕。我們可以添加.catch來(lái)處理它:

        async function f({
          let response = await fetch('http://no-such-url');
        }

        // f() becomes a rejected promise
        f().catch(alert); // TypeError: failed to fetch // (*)

        如果我們忘記在那里添加.catch,那么我們會(huì)得到一個(gè)未處理的promise錯(cuò)誤(在控制臺(tái)中可見)。我們可以使用全局unhandledrejection事件處理程序來(lái)捕獲這樣的錯(cuò)誤,如“帶承諾的錯(cuò)誤處理”一章所述。

        async/await and promise.then/catch

        當(dāng)我們使用async/await時(shí),我們很少需要.then,因?yàn)閍wait處理等待我們的操作。我們可以經(jīng)常try…catch代替.catch。這通常(但不總是)更方便。

        但是在代碼的頂層,當(dāng)我們?cè)谌魏萎惒胶瘮?shù)之外時(shí),我們?cè)谡Z(yǔ)法上不能使用await,所以通常的做法是添加.then/catch來(lái)處理最終結(jié)果或失敗錯(cuò)誤,就像上面例子中的(*)行。

        async/await works well with Promise.all

        當(dāng)我們需要等待多個(gè)承諾時(shí),我們可以用承諾來(lái)包裝它們。一切都在等待:

        // wait for the array of results
        let results = await Promise.all([
          fetch(url1),
          fetch(url2),
          ...
        ]);


        瀏覽 62
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            a视频免费看| 色婷婷激情| 日韩无码123| 午夜亚洲精品| 人妻熟女在线视频| 91麻豆一区二区| 色天使色天堂| 欧美99| JUY-579被丈夫的上司侵犯后的第7天,我| 亚洲做爱视频| 国产棈品久久久久久久久久九秃| 精品无码视频在线观看| 五十路老国产| 国产性爱免费视频| 久久久久久久极品内射| 按摩性高湖婬AAA片A片中国| 久久青青婷婷| 性欧美亚洲| 17.3c一起起草| 丁香五月激情视频| 无码一区二区三区四| AV网站免费观看| 欧美日韩一二| 波多野结衣亚洲视频| 精品中文字幕在线| 豆花成人视频在线观看| 欧美亚洲在线观看| 亚洲国产精品尤物yw在线观看| 亚洲女人天堂AV| 国产麻豆精品ThePorn| 亚洲精品一区无码A片丁香花 | 日韩中文字幕久久| 一级a一级a爱片免费免免高潮| 麻豆久久久久| 欧美激情三区| 亚洲精品成人无码AV在线| 91干干| 97干视频| 欧美做受高潮白| 无套内射在线| 你懂得视频在线观看| 免费的a片| 苍井空精毛片精品久久久| 日本AA视频| 伊人久久大香色综合久久| 国产精品久久久无码专区| 国产精品欧美综合在线| 脓肿是什么原因引起的,该怎么治疗| 亚洲女人天堂| 插菊花综合网1| 秋霞福利视频| 欧美视频免费| 成人无码www在线看免费| 天天插天天插| 中文字幕第五页| 成人做爰A片一区二区app| 成人国产精品| 无码人妻一区二区三区线花季传件 | 91丨人妻丨偷拍| www.yw尤物| 欧日无码| 婷婷五月精品中文字幕| 午夜性福利| 免费高清无码在线观看| 91狠狠综合久久久久久| 高清视频一区二区| 天天色av| 无码一区二区免费| 婷婷操| 久草手机在线| 成人黄色A片| 午夜激情av| 狼友视频在线观看18| 影音先锋成人资源| 91综合网| 91在线免费视频| 日本处女性高潮喷水视频| 亚洲国产精品成人综合色五月 | 亚洲AV永久无码精品国产精| 午夜精品久久久久久久99热精东 | 国产丨熟女丨国产熟女视频| 天天av天天av天天爽| 亚洲v在线| 东京热精品视频| 日本不卡一区| 69av视频| 国产亚洲视频完整在线观看| 亚洲一区二区黄色电影视频网站| AV你懂得| 玖玖爱av| 精品乱子伦一区二区三区毛| 91在线成人视频| 99精品国产一区二区| 婷婷成人综合网| 五月激情天| 日韩熟妇无码| 北条麻妃AV在线播放| 91视频在| 黄色视频在线观看免费网站| 亚洲国产成人91PORN| AV色色| 最新在线中文字幕| 日韩中文字幕一区| 麻豆av在线| 爱搞搞就要搞| 91人妻视频| 日国无码| 欧美亚洲成人网站| 2020人妻中文字幕| 欧美一级高清片免费一级a| 日韩激情一区二区| 亚洲视频www| 777777国产7777777 | 黄色录像一级片| 国产高清无码在线| 黄色视频在线观看18| 亚洲高清国产欧美综合s8| 国产欧美在线观看不卡| 欧美性爱在线网站| 亚洲中文无码av| 婷婷五月天啪啪| 欧美日韩精品一区二区三区视频播放 | 九九九九九九精品视频| 在线观看18s| 成人午夜精品无码区| 亚洲最大黄色视频| 国产成人高潮毛片| 91免费小视频| 西西4444WWW大胆无视频| 亚洲AV无码成人精品区天堂小说 | 五月丁香综合在线| 黄片视频在线播放| 久久99精品久久久久久水蜜桃| 亚洲成人久久久| 少妇搡BBBB搡BBB搡视频一级 | 国产网友自拍| 麻豆激情视频| 亚洲无码观看视频| 躁BBB躁BBB添BBBBBB| 亚洲无码视频免费看| 天天干天天干天天干| 婷婷黄色电影| 伊人影院在线免费观看| 精品一区二区三区四区五区| 国产一区在线看| 亚洲自拍网站| 最新AV在线| 欧一美一婬一伦一区二区三区自慰| 亚洲五月婷婷| 好吊一区二区| 青青操天天干| 最近最经典中文MV字幕| 亚洲天堂网在线视频| A视频在线免费观看| 人人插人人操| 少妇精品无码一区二区免费视频| 999国产精品视频| 2021国产精品视频| 日本三级片网址| 91国产在线播放| www男人的天堂| 嫩草在线精品| 久久欧洲成人精品无码区| 99国产精品久久久久久久| 国产精品人妻无码久久久郑州天气网| 人人爽人人操人人| 久久久久久穴| 学生妹一级J人片内射视频| 国产精品国产伦子伦露看| 亚洲无码操逼视频| 亚洲无码AV免费观看| 日韩AV无码成人精品| 日韩人妻中文| 亚洲一区二区av| 黄色视频在线观看免费| 操日视频| 国产黄片在线播放| 少妇厨房愉情理伦BD在线观看| 成人a视频| 日韩成人无码一区二区| 狠狠爱一区| 午夜视频免费在线观看| 欧美操逼在线观看| 久久久久久久成人| 免费乱伦| 天天射天天干| 2020人妻中文字幕| 黄av在线| 熟女视频91| 亚洲欧洲视频| 短发妹子双人啪啪秀| 二区三区在线观看| 91污视频在线观看| 丁香五月六月| 婷婷日韩一区二区三区| 天天操免费| 亚洲无码中文字幕视频| 福利无码| 亚洲精品成a人在线观看| 婷婷五月丁香六月| 国产AV网| 成人先锋影音| 一级国产欧美成人A片| www.水蜜桃| 99精品视频播放| 在线免费观看av网站| 色综合加勒比| 自拍偷拍视频网站| 无码高清视频| 久久视频网站| 久色视频在线| 超碰人人人人人| 中文字幕在线观看网站| 成年人性生活免费视频| 黄频视频| 有码一区二区三区| 国产精品9| 日本女人高潮视频| 国内精品久久久久久久久久变脸| 欧美激情综合网| 午夜无码电影| 九九九九AV| 特级西西西88大胆无码| 中文字幕第69页| 性无码专区| 蜜桃av无码| 成人黄色电影在线| 超碰在线大香蕉| 成人一级片| 51嘿嘿嘿国产精品伦理| 色诱AV| 无码婷婷| 免费一级婬片AAA片毛片A级| 国产精品无码无套在线照片| 天天操天天操天天| 在线播放你懂的| 久久国产偷拍| 欧美热热| 久久免费视频观看| 木下凛凛子AV888AV在线观看| 内射一区二区三区| 欧美国产日韩在线观看| 成人黄色电影在线观看| 欧美精品在线免费| 一本加勒比HEZYO东京热无码| 亚洲视频中文字幕在线观看| 久热久| 毛片a级| 国产小视频在线播放| 91精品国产综合久久久蜜臀酒店| 成人国产精品秘欧美高清| 日韩无码免费电影| 91女人18毛片水多的意思| 人人操人人爱人人拍| 粉嫩99精品99久久久久久特污| 熊猫成人网| 成人性生活视频| 黄片网站入口| 黄色电影网站在线观看| 亚洲天堂偷拍| 在线日韩一区二区| 欧美日韩色图| 大香蕉伊在线观看| 国产精品无码乱伦| 三级片网站在线观看| 精品A片| 97黄色| 免费成人一级片| 99黄色视频| 性爱视频亚洲| 亚洲91网站| 欧美三P囗交做爰XXXⅩ| 日本高清视频网站| 性福利导航| 婷婷成人电影| 麻豆疯狂做受XXXX高潮视频| 婷婷操逼网| 西西特级无码444www| 五月天无码av| 超碰成人AV| 国产一区无码| 黑人粗大无码| 无码在线不卡| 成人在线网| 91精品少妇高潮一区二区三区不卡| 午夜精品影院| 亚洲高清无码免费| 99热官方网站| 中文字幕免费在线播放| 超碰在线免费| 深夜福利一区二区| 欧美激情亚洲| 11孩岁女精品A片BBB| 人妻无码一区二区三区| AA无码| 91人人妻人人做人人爽| 黄色电影网站在线观看| 好吊视频一区二区三区| 青青草网站在线观看| 中日韩无码|