async 和await 的統一catch處理 二次封裝await

優秀的東西 就要學習和借鑑  上代碼

// 第一代
function  aa() {
  return new Promise(function (resolve,reject) {
    var key = Math.floor(Math.random()*10)
    if(key>4){
      resolve(111)
    }else{
      reject(222)
    }
  })
}
async function bb() {
  var res = await aa()
  console.info(res)
}

bb()

我模擬了 一個 利用promise 處理異步方法的 例子  這裏 會隨機返回正常的data 還是  報錯

正常的圖

報錯的圖

這裏如果利用try catch 包裹 代碼會比較臃腫

借鑑了別人的文章  代碼可以稍作修飾   地址 https://blog.csdn.net/q3254421/article/details/88878288

function  aa() {
  return new Promise(function (resolve,reject) {
    var key = Math.floor(Math.random()*10)
    if(key>4){
      resolve(111)
    }else{
      reject(222)
    }
  })
}
async function bb() {
  var res = await aa().then(data => data).catch(err=>err)
  console.info(res)
}

bb()

結果截圖

可以看到 此時的報錯已經不需要try catch的處理  不過  正確的還好   如果報錯  res 就是報錯的值  這樣無法區分 結果的對錯了

function  aa() {
  return new Promise(function (resolve,reject) {
    var key = Math.floor(Math.random()*10)
    if(key>4){
      resolve(111)
    }else{
      reject(222)
    }
  })
}
async function bb() {
  const [err, data] = await aa().then(data => [null, data] ).catch(err => [err, null])
  console.info(err)
  console.info(data)

}

bb()

這次就把 error 和data 進行了區分了

然後 我們將  aa的一長傳代碼二次封裝一下

function  aa() {
  return new Promise(function (resolve,reject) {
    var key = Math.floor(Math.random()*10)
    if(key>4){
      resolve(111)
    }else{
      reject(222)
    }
  })
}
function to(callback) {
  return callback.then(data => [null, data] ).catch(err => [err, null])
}
async function bb() {
  const [err, data] = await to(aa())
  console.info(err)
  console.info(data)

}

bb()

運行結果是相同的  所以 我們 只是對 返回promise的方法進行了二次封裝  爲什麼叫 to 呢   因爲 這個東西已經有人封裝好了啊 

而且名字 就是  to.js  哈哈    地址  https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/

下載指令  

npm i await-to-js

使用

import to from './to.js';

async function asyncTask() {
     let err, user, savedTask;

     [err, user] = await to(UserModel.findById(1));
     if(!user) throw new CustomerError('No user found');

     [err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
     if(err) throw new CustomError('Error occurred while saving task');

    if(user.notificationsEnabled) {
       const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));  
       if (err) console.error('Just log the error and continue flow');
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章