異步編程——微信小程序

1. 前言

引用來自:微信小程序開發中的多線程處理與異步編程_微信小程序 多線程-CSDN博客

微信小程序是基于JavaScript開發的,與瀏覽器JavaScript不同,小程序運行在WebView內部,沒有多線程的概念。小程序的 JavaScript 是單線程的,也就是說它只有一個主線程來處理所有的任務,包括用戶交互、網絡請求、動畫等。但是,為了提高性能,小程序提供了一些異步編程的方法,比如使用 Promise、async/await 來處理網絡請求和其他異步操作。

2. 異步編程的實現

2.1 Promise

參考:JavaScript Promise | 菜鳥教程

Promise 是一個 ECMAScript 6 提供的類,目的是更加優雅地書寫復雜的異步任務。?

Promise 構造函數接受一個函數作為參數,該函數是同步的并且會被立即執行,所以我們稱之為起始函數。起始函數包含兩個參數 resolve 和 reject,分別表示 Promise 成功和失敗的狀態。

起始函數執行成功時,它應該調用 resolve 函數并傳遞成功的結果。當起始函數執行失敗時,它應該調用 reject 函數并傳遞失敗的原因。

Promise 構造函數返回一個 Promise 對象,該對象具有以下幾個方法:

  • then:用于處理 Promise 成功狀態的回調函數。
  • catch:用于處理 Promise 失敗狀態的回調函數。
  • finally:無論 Promise 是成功還是失敗,都會執行的回調函數

2.1.1?示例1?Promise返回成功狀態

?先以Promise返回成功狀態為例,先執行“起始函數”,由于返回成功狀態(即使用resolve),會再執行then,再執行finally。

onButton1Clicked(){const promise = new Promise((resolve,reject)=>{setTimeout(()=>{console.log("1秒-第一次打印");resolve();},1000)});promise.then(()=>{console.log("成功")setTimeout(()=>{console.log("2秒-第二次打印");},2000)}).finally(()=>{console.log("最后")});},

打印結果:

我好奇:then是成功才會調用的函數,finally無論成功失敗都會調用,那誰先誰后呢?測試發現誰寫前面先調用誰,比如我這樣寫:

promise.finally(...).then();

?打印結果是這樣的:

?

不過菜鳥教程中說不建議這樣寫,建議:最好按 then-catch-finally 的順序

Q: then、catch 和 finally 序列能否順序顛倒?

A: 可以,效果完全一樣。但不建議這樣做,最好按 then-catch-finally 的順序編寫程序。

2.1.2 示例2? Promise 與網絡請求wx.request 結合使用

    onReqAuth() {const request = new Promise((resolve, reject) => {wx.request({url: 'https://www.yourhost.cn/api/',data: {sbxh: 'S20230831-001',ident: 'T01',parm: ''},method: 'POST',success: (res) => {resolve(res.data);},fail: (err) => {reject(err)}})});request.then((data) => {console.log('請求成功', data);// decodeURIComponent:解析URL編碼let msg = decodeURIComponent(data.msg);console.log(msg);this.data.reqResult = msg;this.setData({reqResult: this.data.reqResult})}).catch((err) => {console.error('請求失敗:', err);})},

2.1.3? 示例3 then傳遞值給下一個then

這個示例完全照搬菜鳥教程,

resolve() 中可以放置一個參數用于向下一個 then 傳遞一個值,then 中的函數也可以返回一個值傳遞給 then。但是,如果 then 中返回的是一個 Promise 對象,那么下一個 then 將相當于對這個返回的 Promise 進行操作,這一點從剛才的計時器的例子中可以看出來。

new Promise(function (resolve, reject) {console.log(1111);resolve(2222);
}).then(function (value) {console.log(value);return 3333;
}).then(function (value) {console.log(value);throw "An error";
}).catch(function (err) {console.log(err);
});

注意:

  • resolve 和 reject 的作用域只有起始函數,不包括 then 以及其他序列;
  • resolve 和 reject 并不能夠使起始函數停止運行,別忘了 return。

?resolve 和 reject 并不能夠使起始函數停止運行,這個我是這樣理解的:在起始函數內調用resolve 或 reject 不代表起始函數結束了,它會繼續執行后面的語句,直到函數結束;然后在起始函數執行完畢后,再去執行對應的成功或失敗后需要操作。比如在示例1的resolve后增加打印,將會打印如下:

2.2 async/await

5.3 ES6 async 函數 | 菜鳥教程

2.2.1?async?異步關鍵詞

async 是 ES7 才有的與異步操作有關的關鍵字。

async 函數返回一個 Promise 對象,可以使用 then 方法添加回調函數。

async function testAsync(){return "testAsync";
}onButton1Clicked(){console.log(testAsync());testAsync().then(v =>{console.log(v);})
}

?

2.2.2 await 操作符

?async 函數中可能會有 await 表達式,async 函數執行時,如果遇到 await 就會先暫停執行 ,等到觸發的異步操作完成后,恢復 async 函數的執行并返回解析值。

await 關鍵字僅在 async function 中有效。

function testAwait(){return new Promise((resolve,reject)=>{console.log("testAwait");setTimeout(()=>{console.log("setTimeout");resolve();},1000);});
}async function helloASync(){await testAwait();console.log("helloASync")
}helloASync();

正常情況下,await 命令后面是一個 Promise 對象,它也可以跟其他值,如字符串,布爾值,數值以及普通函數。

function testAwait(){console.log("testAwait");
}
async function helloAsync(){await testAwait();console.log("helloAsync");
}
helloAsync();
// testAwait
// helloAsync

await針對所跟不同表達式的處理方式:

  • Promise 對象:await 會暫停執行,等待?Promise 對象 resolve,然后恢復 async 函數的執行并返回解析值。
  • 非 Promise 對象:直接返回對應的值。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79383.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS-ArkUI V2狀態-PersistenceV2:持久化存儲UI狀態

PersistenceV2類是一個與AppStorageV2類用法非常相似的類。因為它倆是子類和父類的關系。如果不了解AppStorageV2,可以先跳轉至了解一下這個類。 HarmonyOS-ArkUI V2工具類:AppStorageV2:應用全局UI狀態存儲-CSDN博客 PersistenceV2相比于其父類AppStorageV2而言,它存儲的…

《Mycat核心技術》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架構

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章匯總:https://binghe.gitcode.host/md/all/all.html 星球項目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件應用點擊apk無反應的處理

最近遇到一個問題,在A13上,打開文件管理應用時,點擊apk 無反應或者啟動安裝進程后安裝完成或取消安裝進程,再次點擊apk 無反應。在此記錄該問題。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷題記錄貼

1.題目:現在運營想要對用戶的年齡分布開展分析,在分析時想要剔除沒有獲取到年齡的用戶,請你取出所有年齡值不為空的用戶的設備ID,性別,年齡,學校的信息。 錯誤:select device_id,gender,age,un…

【Windows本地部署n8n工作流自動平臺結合內網穿透遠程在線訪問】

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python爬蟲降低IP封禁,python爬蟲除了使用代理IP和降低請求頻率,還有哪些方法可以應對IP封禁?

文章目錄 前言1. 利用 CDN 節點2. 模擬真實用戶行為3. 使用 IP 池輪換策略4. 處理 Cookie 和會話信息5. 分布式爬蟲 前言 除了使用代理 IP 和降低請求頻率,以下這些方法也能應對 IP 封禁: Python 3.13.2安裝教程(附安裝包)Python…

光譜相機的成像方式

光譜相機的成像方式決定了其如何獲取物體的空間與光譜信息,核心在于分光技術與掃描模式的結合。以下是主要成像方式的分類解析: ?一、濾光片切換型? ?1. 濾光片輪(Filter Wheel)? ?原理?:通過旋轉裝有多個窄帶…

AI在市場營銷分析中的核心應用及價值,分場景詳細說明

以下是 AI在市場營銷分析中的核心應用及價值,分場景詳細說明: 1. 客戶行為分析與細分 AI技術應用: 機器學習:分析用戶點擊、購買、瀏覽等行為數據,識別消費模式(如高頻購買時段、偏好品類)。聚…

潯川AI翻譯v7.0更新預告

親愛的潯川AI翻譯用戶: 感謝您一直以來的支持!潯川AI翻譯自推出以來,已迭代6個版本,其中**v2.0和v4.0因技術問題(翻譯結果顯示異常、注冊失敗、密碼找回功能失效等)**被迫下架。我們深知這些問題影響了您…

LabVIEW中二維數組轉換為彩色圖

在 LabVIEW 編程環境下,有用戶想把二維數組轉化為彩色圖片。通過附件的程序示例,給出了具體實現方法,包括對數據的處理以及顏色映射的設置等內容,還涉及解決數據范圍與顏色映射不匹配等問題。公司官網有源碼 程序功能及細節 功能&…

【模型常見評價指標(分類)】

目錄 常見指標 其他的評估指標 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常見指標 其他的評估指標 3.1 BLEU BLEU(Bilingual Evaluation Understudy,雙語評估替補)分數是評估一種語言翻譯成另一種語言的文本質量的指標。它將“質…

期貨數據API對接實戰指南

一、期貨數據接口概述 StockTV提供全球主要期貨市場的實時行情與歷史數據接口,覆蓋以下品種: 商品期貨:原油、黃金、白銀、銅、天然氣、農產品等金融期貨:股指期貨、國債期貨特色品種:馬棕油、鐵礦石等區域特色期貨 …

TCP連接建立:為什么是三次握手?

接下來,以三個方面分析三次握手的原因: 1、三次握手才可以阻止重復歷史連接的初始化(主要原因) 2、三次握手才可以同步雙方的初始化序列號 3、三次握手才可以避免資源浪費 原因一:避免歷史連接 簡單來說&#xff0…

Table類型的表單

形如下面的圖片 1 label與prop屬性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "刪除時間",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…

Cesium 加載 本地 b3dm 格式文件 并且 獲取鼠標點擊處經緯度 (親測可用)

很奇怪cesium 里面只支持 相對路徑 不支持絕對路徑 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源碼 const viewer new Cesium.Viewer("cesiu…

Spring AI核心之“ChatClient”-來自DeepSeek

在 Spring AI 生態中,ChatClient 是一個面向開發者設計的高層抽象接口,它簡化了與大型語言模型(LLMs)的交互流程,尤其適用于需要快速構建端到端 AI 應用(如聊天機器人、RAG 問答系統等)的場景。…

購買電腦時,主要需要關注以下核心配置,它們直接影響性能、使用體驗和價格。根據需求(辦公、游戲、設計、編程等),側重點會有所不同。看看Deepseek的建議

1. 處理器(CPU) 作用:電腦的“大腦”,影響整體運算速度和多任務處理能力。關鍵參數: 品牌與型號:Intel(酷睿i3/i5/i7/i9)或 AMD(銳龍R3/R5/R7/R9)。核心/線程…

408數據結構緒論刷題001

答案:D 解析: ? A選項:數據元素是組成數據對象的基本單位 ,它只是數據的基本個體,不能完整定義數據結構,所以A選項錯誤。 ? B選項:數據對象是性質相同的數據元素的集合,僅僅描述…

c++STL——vector的使用和模擬實現

文章目錄 vector的使用和模擬實現vector的使用vector介紹重點接口的講解迭代器部分默認成員函數空間操作增刪查改操作迭代器失效問題(重要)調整迭代器 vector的模擬實現實現的版本模擬實現結構預先處理的函數尾插函數push_backswap函數賦值重載size函數reserve函數 迭代器默認成…

Java深入

String相關的類 1.String不可變的類 源碼&#xff1a; public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for th…