小程式中如何優雅的捕捉非同步方法的異常
原生小程式中如何優雅的捕捉非同步方法的異常?以下這篇文章為大家介紹一下小程式中優雅的使用async await非同步程式設計的方法,希望對大家有幫助!
最近開始寫一個開源的雲端開發社群小程序,在寫的過程中慢慢的摸索了一些對於開發和測試的過程中又幫助的奇技淫巧。這篇文章講一下在 原生小程式中如何優雅的捕捉非同步方法的異常。
傳統方法
在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 catch
,Promise.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 } // 成功后执行的逻辑
控制台列印的執行時間輸出如下,列印格式是
#【路由頁面】---【方法描述】:執行時間
當然我的封裝方式是針對我自己的程式碼,你也可以根據你的實際業務再進行改造,例如埋點的統一入口之類的,可以大幅提升開發效率!
總結
在使用雲端開發時,為了開發體驗不得不使用原生的語言去寫,相對閉塞的環境就使得很多web端的方法沒法使用,在近期的摸索中我也找到了許多提升原生小程式開發體驗的方式,之後將會陸續更新。
【相關學習推薦:小程式開發教學】
以上是小程式中如何優雅的捕捉非同步方法的異常的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

隨著行動互聯網技術和智慧型手機的普及,微信成為了人們生活中不可或缺的一個應用。而微信小程式則讓人們可以在不需要下載安裝應用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發微信小程式。一、準備工作在使用Python開發微信小程式之前,需要先安裝相關的Python函式庫。這裡推薦使用wxpy和itchat這兩個函式庫。 wxpy是一個微信機器

async是es7的。 async和await是ES7中新增內容,是對於非同步操作的解決方案;async/await可以說是co模組和生成器函數的語法糖,用更清晰的語意解決js非同步程式碼。 async顧名思義是「非同步」的意思,async用於聲明一個函數是異步的;async和await有一個嚴格規定,兩者都離不開對方,且await只能寫在async函數中。

實作微信小程式中的卡片翻轉特效在微信小程式中,實現卡片翻轉特效是一種常見的動畫效果,可以提升使用者體驗和介面互動的吸引力。以下將具體介紹如何在微信小程式中實現卡片翻轉的特效,並提供相關程式碼範例。首先,需要在小程式的頁面佈局檔案中定義兩個卡片元素,一個用於顯示正面內容,一個用於顯示背面內容,具體範例程式碼如下:<!--index.wxml-->&l

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關鍵字就可以進入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統辨識輸入的生僻字圖片,支付寶工程師確認後,將會對字庫進行補錄入。本站注意到,使用者也可以在小程式體驗最新的拆字輸入法,這項輸入法針對讀音不明確的生僻字設計。用戶拆

小程式能用react,其使用方法:1、基於「react-reconciler」實作一個渲染器,產生一個DSL;2、建立一個小程式元件,去解析和渲染DSL;3、安裝npm,並執行開發者工具中的建構npm;4、在自己的頁面中引入包,再利用api即可完成開發。

uniapp如何實現小程式和H5的快速轉換,需要具體程式碼範例近年來,隨著行動網路的發展和智慧型手機的普及,小程式和H5成為了不可或缺的應用形式。而uniapp作為一個跨平台的開發框架,可以在一套程式碼的基礎上,快速實現小程式和H5的轉換,大大提高了開發效率。本文將介紹uniapp如何實現小程式和H5的快速轉換,並給出具體的程式碼範例。一、uniapp簡介unia

實現思路x01服務端的建立首先,在服務端,使用socket進行訊息的接受,每接受一個socket的請求,就開啟一個新的線程來管理訊息的分發與接受,同時,又存在一個handler來管理所有的線程,從而實現對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務端簡單多了,客戶端的作用只是對消息的發送以及接受,以及按照特定的規則去輸入特定的字符從而實現不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個線程,一個是專門用於接受消息,一個是專門用於發送消息的至於為什麼不用一個呢,那是因為,只

這篇文章給大家帶來了關於微信小程式的相關問題,其中主要介紹瞭如何在小程式中用公眾號範本訊息,下面一起來看一下,希望對大家有幫助。
