成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Async/Await 你是會用,但是你知道怎么處理錯誤嗎?

開發 前端
to函數返回一個Promise且值是一個數組,數組之中有兩個元素,如果索引為0的元素不為空值,說明該請求報錯,如果索引0的元素為空值說明該請求沒有報錯,也就是成功。

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心

Promise封裝請求

大家平時如果使用Promise封裝請求,那么當你使用這個請求函數的時候是這樣的:

// 封裝請求函數
const request = (url, params) => {
  return new Promise((resolve, reject) => {
    // ...do something
  })
}

// 使用時
const handleLogin = () => {
  request(
    '/basic/login',
    {
      usename: 'sunshine',
      password: '123456'
    }
  ).then(res => {
    // success do something
  }).catch(err => {
    // fail do something
  })
}

可以看到,當你的請求成功時,會調用then方法,當你的請求失敗時會調用catch方法。

async/await

Promise的出現解決了很多問題,但是如果請求多了且有順序要求的話,難免又會出現嵌套的問題,可讀性較差,比如:

const handleLogin = () => {
  request(
    '/basic/login',
    {
      usename: 'sunshine',
      password: '123456'
    }
  ).then(res => {
    // 登錄成功后獲取用戶信息
    request(
      '/basic/getuserinfo',
      res.id
    ).then(info => {
      this.userInfo = info
    }).catch()
  }).catch(err => {
    // fail do something
  })

所以這個時候async/await出現了,他的作用是:用同步的方式執行異步操作,上面的代碼使用async/await的話可以改寫成:

const handleLogin = async () => {
  const res = await request('/basic/login', {
    usename: 'sunshine',
    password: '123456'
  })
  const info = await request('/basic/getuserinfo', {
    id: res.id
  })
  this.userInfo = info
}

這樣的話代碼的可讀性比較高,而不會出現剛剛的嵌套問題,但是現在又有一個問題了,Promise有catch這個錯誤回調來保證請求錯誤后該做什么操作,但是async/await該如何捕獲錯誤呢?

await-to-js

其實已經有一個庫await-to-js已經幫我們做了這件事,我們可以看看它是怎么做的,它的源碼只有短短十幾行,我們應該讀讀它的源碼,學學它的思想

源碼很簡單

/**
 * @param { Promise } 傳進去的請求函數
 * @param { Object= } errorExt - 拓展錯誤對象
 * @return { Promise } 返回一個Promise
 */
export function to(
  promise,
  errorExt
) {
  return promise
    .then(data => [null, data])
    .catch(err => {
      if (errorExt) {
        const parsedError = Object.assign({}, err, errorExt)
        return [parsedError, undefined]
      }

      return [err, undefined]
    })
}

export default to

源碼總結:to函數返回一個Promise且值是一個數組,數組之中有兩個元素,如果索引為0的元素不為空值,說明該請求報錯,如果索引0的元素為空值說明該請求沒有報錯,也就是成功。

使用很簡單

我們該怎么去使用這個to函數呢?其實很簡單,還是剛剛的例子

const handleLogin = async () => {
  const [resErr, res] = await to(request('/basic/login', {
    usename: 'sunshine',
    password: '123456'
  }))
  if (resErr) {
    // fail do somthing
    return
  }
  const [userErr, info] = await to(request('/basic/getuserinfo', {
    id: res.id
  }))
  if (userErr) {
    // fail do somthing
    return
  }
  this.userInfo = info
}

所以說,偶爾看看一些庫的源碼,還是能學到東西的!??!

責任編輯:武曉燕 來源: 前端之神
相關推薦

2022-02-10 09:04:50

架構

2019-01-28 17:42:33

Python數據預處理數據標準化

2010-11-23 10:21:53

跳槽

2024-02-19 00:00:00

Docker輕量級容器

2024-12-04 08:40:19

2013-02-27 10:27:44

GitHub

2021-01-21 09:09:18

時區轉換程序

2024-03-12 08:37:32

asyncawaitJavaScript

2021-11-12 05:59:23

容災備份5G

2023-12-20 08:23:53

NIO組件非阻塞

2015-12-01 13:33:51

UnikernelLinux運維

2022-09-28 18:16:34

JavaJDK

2024-11-26 00:45:29

free區域字段

2024-03-06 09:24:50

AsyncAwaitC#

2020-12-18 08:59:51

蘋果iCloud儲存照片

2023-01-31 09:02:24

JSVMVR

2012-12-21 16:57:37

手機安全個人信息泄漏個人信息安全

2023-06-30 08:26:24

Java注解Java程序元素

2023-06-08 08:06:07

error錯誤頁原理

2019-03-14 12:39:55

安全云計算深信服
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美综合精品久久成人 | 欧美日韩国产传媒 | 欧美精品一区二区三区在线 | 一级黄在线观看 | 91精品国产高清一区二区三区 | 一级黄色片一级黄色片 | 欧美午夜精品久久久久免费视 | 羞羞色网站 | 伊人网综合 | 国产精品揄拍一区二区久久国内亚洲精 | 久久久人| 91一区二区三区在线观看 | 欧美精品国产精品 | 色婷婷一区二区三区四区 | 国产高清在线 | 久热国产在线 | 中文字幕在线观 | 国外激情av| 国产目拍亚洲精品99久久精品 | 日韩成人在线播放 | 在线观看中文字幕视频 | 国产精品99999999 | 国产成人短视频在线观看 | 亚洲精品66 | 不卡一区二区三区四区 | 精品亚洲一区二区 | 国产真实精品久久二三区 | 成人1区2区 | 欧美一区二区三区大片 | 在线亚州 | 国产高清在线精品一区二区三区 | 亚洲欧洲成人 | 少妇精品亚洲一区二区成人 | 久久国产成人 | 宅女噜噜66国产精品观看免费 | 99久久久久 | av一区二区三区在线观看 | 91青娱乐在线 | 91视频大全 | 97超碰成人 | 日韩精品一区二区三区视频播放 |