天天看點

await 錯誤捕獲實作方式源碼示例解析

作者:IT小白進階之路
這篇文章主要為大家介紹了await 錯誤捕獲實作方式源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

Promise 是一種在 JavaScript 中用于處理異步操作的機制。Promise 在開發中被廣泛使用,這篇文章将學習如何優雅的捕獲 await 的錯誤。

資源:

倉庫位址:await-to-js

參考文章:How to write async await without try-catch blocks in Javascript (grossman.io)

Promise 的使用方法

  • 建立一個 Promise 執行個體。這通常是通過調用 Promise 構造函數來完成的,并将一個函數作為參數傳遞給構造函數,該函數接收兩個參數:resolve 和 reject。resolve 和 reject 分别用于處理 Promise 的成功和失敗結果。
  • 在函數體内執行異步操作。當異步操作完成時,如果執行成功,則調用 resolve 函數來将 Promise 的狀态變為“已完成”,并将結果作為參數傳遞給 resolve 函數;如果執行失敗,則調用 reject 函數将 Promise 的狀态變為“已拒絕”,并将失敗的原因作為參數傳遞給 reject 函數。
  • 使用 then 方法來處理 Promise 的成功和失敗結果。then 方法接收兩個參數:一個處理成功結果的函數和一個處理失敗結果的函數。在 Promise 狀态變為“已完成”或“已拒絕”後,then 方法會自動執行相應的處理函數。
  • 示例代碼如下:

    const myPromise = new Promise(function(resolve, reject) {
      // 執行異步操作
      setTimeout(function() {
        // 異步操作成功
        resolve('Success');
      }, 1000);
    });
    // 處理 Promise 的成功和失敗結果
    myPromise.then(function(result) {
      // 處理成功結果
      console.log(result);
    }).catch(function(err){
      // 處理失敗
      console.log(err)
    })           

    異步函數正在等待 Promise,是以當 promise 遇到錯誤時,它會抛出一個異常,該異常将在 promise 的 catch 方法中捕獲。

    其他處理錯誤的方式:

    try{
        const res = await myPromise()
    }catch(e){
        console.log(e)
    }           

    當代碼中有大量的異步操作時,就需要有很多的try/catch 塊,代碼看起來就很臃腫,那麼有什麼更好的處理這些錯誤的辦法呢?

    await-to-js

    這個項目的 slogan 是:

    Async await wrapper for easy error handling

    異步等待包裝,友善錯誤處理

    用法:

    import to from 'await-to-js';
    [ err, user ] = await to(UserModel.findById(1));
    if(!user) return cb('No user found');           

    to 函數接收一個 Promise,然後将成功響應解析為數組,并将傳回資料作為第二項。從捕獲中收到的錯誤作為第二項。

    源碼

    /**
     * @param { Promise } promise
     * @param { Object= } errorExt - Additional Information you can pass to the err object
     * @return { Promise }
     */
    export function to (
      promise: Promise,
      errorExt?: object
    ): Promise<[U, undefined] | [null, T]> {
      return promise
        .then<[null, T]>((data: T) => [null, data])
        .catch<[U, undefined]>((err: U) => {
          if (errorExt) {
            const parsedError = Object.assign({}, err, errorExt);
            return [parsedError, undefined];
          }
          return [err, undefined];
        });
    }
    export default to;           

    接收一個 Promise 執行個體和一個可選的 errorExt 對象作為參數。該函數傳回一個新的 Promise。

    原理是使用 then 方法處理 Promise 的成功結果,并使用 catch 方法處理 Promise 的失敗結果。如果 Promise 執行成功,則會将結果包裝成一個包含兩個元素的數組并作為新的 Promise 的成功結果傳回;如果 Promise 執行失敗,則會将錯誤對象包裝成一個包含兩個元素的數組并作為新的 Promise 的失敗結果傳回。

    使用await-to-js,得以一行代碼完成對異步代碼錯誤的捕獲,閱讀文章得知,await-to-js 是作者通過goLang啟發得來的靈感。更加說明了融會貫通,學以緻用的重要性。

    https://www.linuxprobe.com/await-linux-await.html

    繼續閱讀