<acronym id="indot"><dfn id="indot"></dfn></acronym>
<span id="indot"></span>

<bdo id="indot"><meter id="indot"></meter></bdo>
<label id="indot"><samp id="indot"></samp></label>
<label id="indot"><xmp id="indot">
  • <span id="indot"><table id="indot"></table></span>
    <center id="indot"><optgroup id="indot"></optgroup></center>
  • <bdo id="indot"><meter id="indot"></meter></bdo>
      當前位置:首頁 > javascript > 正文內容

      7個Js async/await高級用法

      hxing6412年前 (2023-12-17)javascript2415


      JavaScript的異步編程已經從回調(Callback)演進到Promise,再到如今廣泛使用的async/await語法。后者不僅讓異步代碼更加簡潔,而且更貼近同步代碼的邏輯與結構,大大增強了代碼的可讀性與可維護性。在掌握了基礎用法之后,下面將介紹一些高級用法,以便充分利用async/await實現更復雜的異步流程控制。


      1. async/await與高階函數

      當需要對數組中的元素執行異步操作時,可結合async/await與數組的高階函數(如map、filter等)。



      // 異步過濾函數
      async function asyncFilter(array, predicate) {
          const results = await Promise.all(array.map(predicate));
       
          return array.filter((_value, index) => results[index]);
      }
       
      // 示例
      async function isOddNumber(n) {
          await delay(100); // 模擬異步操作
          return n % 2 !== 0;
      }
       
      async function filterOddNumbers(numbers) {
          return asyncFilter(numbers, isOddNumber);
      }
       
      filterOddNumbers([1, 2, 3, 4, 5]).then(console.log); // 輸出: [1, 3, 5]


      2. 控制并發數

      在處理諸如文件上傳等場景時,可能需要限制同時進行的異步操作數量以避免系統資源耗盡。



      async function asyncPool(poolLimit, array, iteratorFn) {
          const result = [];
          const executing = [];
       
          for (const item of array) {
              const p = Promise.resolve().then(() => iteratorFn(item, array));
              result.push(p);
       
              if (poolLimit <= array.length) {
                  const e = p.then(() => executing.splice(executing.indexOf(e), 1));
                  executing.push(e);
                  if (executing.length >= poolLimit) {
                      await Promise.race(executing);
                  }
              }
          }
       
          return Promise.all(result);
      }
       
      // 示例
      async function uploadFile(file) {
          // 文件上傳邏輯
      }
       
      async function limitedFileUpload(files) {
          return asyncPool(3, files, uploadFile);
      }


      3. 使用async/await優化遞歸

      遞歸函數是編程中的一種常用技術,async/await可以很容易地使遞歸函數進行異步操作。


      // 異步遞歸函數
      async function asyncRecursiveSearch(nodes) {
          for (const node of nodes) {
              await asyncProcess(node);
              if (node.children) {
                  await asyncRecursiveSearch(node.children);
              }
          }
      }
       
      // 示例
      async function asyncProcess(node) {
          // 對節點進行異步處理邏輯
      }


      4. 異步初始化類實例

      在JavaScript中,類的構造器(constructor)不能是異步的。但可以通過工廠函數模式來實現類實例的異步初始化。



      class Example {
          constructor(data) {
              this.data = data;
          }
       
          static async create() {
              const data = await fetchData(); // 異步獲取數據
              return new Example(data);
          }
      }
       
      // 使用方式
      Example.create().then((exampleInstance) => {
          // 使用異步初始化的類實例
      });


      5. 在async函數中使用await鏈式調用

      使用await可以直觀地按順序執行鏈式調用中的異步操作。


      class ApiClient {
          constructor() {
              this.value = null;
          }
       
          async firstMethod() {
              this.value = await fetch('/first-url').then(r => r.json());
              return this;
          }
       
          async secondMethod() {
              this.value = await fetch('/second-url').then(r => r.json());
              return this;
          }
      }
       
      // 使用方式
      const client = new ApiClient();
      const result = await client.firstMethod().then(c => c.secondMethod());


      6. 結合async/await和事件循環

      使用async/await可以更好地控制事件循環,像處理DOM事件或定時器等場合。
      // 異步定時器函數
      async function asyncSetTimeout(fn, ms) {
          await new Promise(resolve => setTimeout(resolve, ms));
          fn();
      }
       
      // 示例
      asyncSetTimeout(() => console.log('Timeout after 2 seconds'), 2000);


      7. 使用async/await簡化錯誤處理

      錯誤處理是異步編程中的重要部分。通過async/await,可以將錯誤處理的邏輯更自然地集成到同步代碼中。


      async function asyncOperation() {
          try {
              const result = await mightFailOperation();
              return result;
          } catch (error) {
              handleAsyncError(error);
          }
      }
       
      async function mightFailOperation() {
          // 有可能失敗的異步操作
      }
       
      function handleAsyncError(error) {
          // 錯誤處理邏輯
      }


      通過以上七個async/await的高級用法,開發者可以在JavaScript中以更加聲明式和直觀的方式處理復雜的異步邏輯,同時保持代碼整潔和可維護性。在實踐中不斷應用和掌握這些用法,能夠有效地提升編程效率和項目的質量。

      掃描二維碼推送至手機訪問。

      版權聲明:本文由星星博客發布,如需轉載請注明出處。

      本文鏈接:http://www.7811333.com/?id=482

      分享給朋友:

      “7個Js async/await高級用法” 的相關文章

      JS中call aplly bind的區別

      call、apply、bind的作用是改變函數運行時this的指向。1. call()的第一個參數為this綁定的對象,后面傳入一串參數列表。當第一參數為null或undefined時,默認指向window對象。2. apply()和call()類似,唯一的不同點在于第二個參數傳入一個參數數組。當第...

      JS逆向實戰20——深入解析JavaScript虛擬機逆向工程

      在Web開發領域中,JavaScript(JS)是一門廣泛使用的編程語言。然而,由于其腳本性質和開放性,JavaScript代碼的安全性一直備受關注。為了保護知識產權和提高代碼的安全性,一些開發者會將JavaScript代碼進行加密和混淆。這就需要逆向工程師掌握JS逆向技術來還原加密和混淆后的代碼。...

      js模塊化歷程

      這是一篇關于js模塊化歷程的長長的流水賬,記錄js模塊化思想的誕生與變遷,展望ES6模塊化標準的未來。經歷過這段歷史的人或許會感到滄桑,沒經歷過的人也應該知道這段歷史。 無模塊時代在ajax還未提出之前,js還只是一種“玩具語言”,由Brendan Eich花了不到十天時間發明,用來在網頁...

      typescript 中 omit 的理解

      在 TypeScript 中,Omit 是一種非常有用的工具類型,它可以用于創建一個新的類型,這個新類型是從現有類型中排除了指定的屬性后得到的。如果你想要處理一個對象但又不需要包含某些屬性,那么 Omit 可以幫助你快速地創建一個新的類型。 比如說,...

      js字符串總結

      ES5和字符串 一、ES5的語法 js在產生的時候,年代比較早,當時的web需求比較少,所以剛開始的js功能比較少,語法沒有特別嚴謹。隨著時代的發展和web應用的普及,js需要更多的功能,以及更嚴謹的語法,所以,js會有版本的升級。第一版的js是ECM...

      發表評論

      訪客

      ◎歡迎參與討論,請在這里發表您的看法和觀點。
      主站蜘蛛池模板: 日韩亚洲国产综合高清| 亚洲狠狠婷婷综合久久| 激情综合婷婷色五月蜜桃| 五月婷婷综合免费| 国产色产综合色产在线观看视频| 国产亚洲综合视频| 久久精品亚洲综合| 人人狠狠综合88综合久久| 久久精品综合一区二区三区| 亚洲综合久久成人69| 亚洲国产综合人成综合网站| 91精品国产综合久久香蕉| 色天使久久综合网天天| 亚洲国产成人九九综合| 熟女少妇色综合图区| 色天天综合久久久久综合片| 亚洲国产综合专区在线电影| 狠狠色综合久久久久尤物| 亚洲熟女综合色一区二区三区| 少妇人妻综合久久中文字幕| 日韩亚洲国产综合久久久| 色综合天天综合狠狠| 久久九九精品国产综合喷水| 国产综合精品蜜芽| 色综合久久天天综线观看| 久久综合久久久久88| 97se亚洲国产综合自在线| 亚洲国产成人九九综合| 五月天婷五月天综合网站| 色综合综合色综合色综合| 久久综合综合久久综合| 久久久久青草线蕉综合超碰| 亚洲综合色丁香麻豆| 色青青草原桃花久久综合| 一本色综合网久久| 亚洲色欲啪啪久久WWW综合网 | 国产综合色产在线精品| 国产色产综合色产在线观看视频| 狠狠爱天天综合色欲网| 国产成人综合久久精品免费| 精品久久人人做人人爽综合|