91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

小程序中怎么優雅的捕捉異步方法的異常

發布時間:2021-12-22 10:35:37 來源:億速云 閱讀:187 作者:小新 欄目:移動開發

小編給大家分享一下小程序中怎么優雅的捕捉異步方法的異常,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

傳統方法

在ES7之后,我們往往使用 async await 語法來進行異步編程,如果我們要捕捉異常的話一般有以下兩種方式

try catch

async func(){
     //do something
}
try {
    const res = await func()
} catch (error) {
    //handle error
}

首先是 try catch 捕捉異常,使用 try catch 確實可以很方便的去處理異常,也可以阻止后面方法的進行,但是在開發的過程中咱們常常不止一個異步方法,大量使用 try catch 不僅寫的不爽,也絕對算不上優雅。

Promise.catch()

async func(){
     //do something
}

const res = await func().catch(error=>{
    //handle error
})

Promise對象內部了try catch ,我們可以使用鏈式調用的方法來處理異常。相比try catchPromise.catch() 寫起來當然是爽很多的,看著也比較優雅了。

但是當我們想要在捕捉到錯誤后停止方法的繼續執行,那么 Promise.catch() 就沒辦法做到了,如下例子

async func(){
     //do something
}

const res = await func().catch(error=>{
    // 即使return也無效
    return
})
// 如果有錯誤的話我就不執行了

優雅方式

await-to-js github鏈接

https://github.com/scopsy/await-to-js

await-to-js 這個庫應該很多人了解過了,它是一個異步請求的包裝器,可以用于處理異步請求的錯誤,根據我們上面的需求改造為使用 await-to-js 的例子如下

import to from 'await-to-js';

async func(){
     //do something
}

const [err,res] = await to(func())
if(err){
    //handle error
    return
}
// 如果有錯誤的話我就不執行了

通過將我們的異步方法作為 to() 方法的參數,返回值通過一個數組解構獲取,數組第一個值為捕捉到的錯誤,第二個值為正常執行的返回值。

await-to-js的實現原理也非常簡單,就是使用 Promise.catch()獲取到異常后再將結果返回在一個數組中, 源代碼如下

export function to<T, U = Error> (
	promise: Promise<T>,
	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;

小程序中使用

在小程序中,我們使用npm包并不方便,因此我們可以直接將源碼拿出來單獨使用,再加以改造的話就可以優雅的進行異步編程啦,我自己的改造方式如下。

// lib/awaitTo.js
module.exports = function to(promise, description="unknown") {
	const pages = getCurrentPages()
	const route = pages[pages.length - 1].route||'unknown'
	description = `[${route}]---[${description}]`
	console.time(description)
	return promise
		.then(function (data) {
			console.timeEnd(description)
			return [null, data];
		})
		.catch(function (err) {
			wx.showToast({
				title: '請求失敗',
				icon: "none"
			})
			return [err, undefined];
		});
}

我通過 getCurrentPages() 的方式獲取到異步方法執行時對應的頁面路由,在將第二個參數改為自己對異步方法的一個描述,每一次調用異步方法的時候就會在 控制臺輸出執行時間。 實際使用的例子如下:

const to = require("../../lib/awaitTo")
const [err, res] = await to(db.collection("post").add({
        data: form
}),"addPost")
if (err) {
        // 處理我的錯誤
        return
}
// 成功后執行的邏輯

控制臺打印的執行時間輸出如下,打印格式是

【路由頁面】---【方法描述】:執行時間

以上是“小程序中怎么優雅的捕捉異步方法的異常”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

木里| 五莲县| 咸宁市| 高州市| 泰兴市| 南宁市| 彭水| 五峰| 石嘴山市| 中山市| 田东县| 万安县| 阜南县| 左权县| 布尔津县| 盐边县| 湘潭县| 达拉特旗| 洛扎县| 林州市| 德令哈市| 彭山县| 固阳县| 留坝县| 衡水市| 洪江市| 水富县| 陵水| 论坛| 东台市| 西峡县| 镇康县| 柞水县| 综艺| 潞城市| 宜丰县| 苏州市| 清新县| 筠连县| 桑植县| 惠来县|