JavaScript 如何優雅的處理 async/await 異常


Async/await 是 ES7 中的新特性,它可以讓開發者編寫異步代碼像同步代碼一樣,它的優勢我們通過 Async/Await 這篇文章來了解。

的確它給我們帶來了很多方便的地方,但是在 async/await 中如何來處理錯誤呢?在異步的調用中,會產生各種不同的錯誤,例如:HTTP 請求產生了錯誤、訪問 DB 產生的異常、操作文件產生異常。在 Promise 的使用中,當承諾遇到了錯誤,它會拋出一個異常,該異常將被捕獲到一個方法回調中。在 async/await 中,我們又如何處理呢,當然很多人會回答:使用 try/catch 來捕獲這些錯誤,這樣一來代碼會看起來像這樣:

async function asyncFunc() {
    try {
        const product = await Api.product({ id : 10 });
        if(!product) {
            console.log('No product found');
        }
    }
    catch(err) {
        console.log(err);
    }

    try {
        const saveProduct = await Api.save({
            id: product.id,
            name: product.name
        });
    }
    catch(err) {
        console.log(err);
    }

}

回顧上面的代碼,try/catch 的確可以來解決錯誤異常的處理,但是讓代碼非常的不干凈,原本 async/await 的優勢就是讓代碼更佳的簡約,這樣一來又違背了它的初中,這讓我們進入了新的思考。

// to.js
export default function to(promise) {
   return promise.then(data => {
      return [null, data];
   })
   .catch(err => [err]);
}

這一個工具方法接收一個承諾,讓后將異步獲取到的數據作為返回數組的第二個值,捕捉到的錯誤作為返回數組第一個值。然后我們的異步代碼會變成這樣:

import to from './to.js';

async function asyncFunc() {
    let err, product, saveProduct;

    [err, product] = await to(Api.product({ id : 10 }));
    if(!product) {
        console.log('No product found');
    }

    [err, saveProduct] = await to(Api.save({
        id: product.id,
        name: product.name
    }));

    if(err) {
        console.log(err);
    }
}

由此一來,async/await 又回到了最初的簡潔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM