Uniapp當中的async/await的作用

一、原始代碼的行為(使用 async/await

const getUserMessagePlan = async () => {// 等待兩個異步操作完成const tabsList = await message.getTagesList();        // 等待獲取標簽列表const tagsStateList = await message.getTagsStateList(); // 等待獲取狀態列表// 后續代碼在數據就緒后執行const tempMessageList = [];for (let i = tabsList.length - 1; i >= 0; i--) {const user = await message.getUserInfo(tabsList[i].senderId); // 等待獲取用戶信息// 構造數據對象const t = { ... };tempMessageList.push(t);}userMessageList.value = sortData(tempMessageList);
};

? 關鍵特性
? await 會暫停當前函數的執行,直到 Promise 完成,并按順序解析結果。
? 所有異步操作(如網絡請求)會按代碼順序依次執行,確保數據就緒后才進行后續處理。


二、刪除 async/await 的后果

若直接刪除 async/await,代碼會變成:

const getUserMessagePlan = () => {// 直接獲取 Promise 對象(未等待結果)const tabsList = message.getTagesList();        // 返回未完成的 Promiseconst tagsStateList = message.getTagsStateList(); // 同上// 此時 tabsList 和 tagsStateList 是 Promise 對象,而非實際數據const tempMessageList = [];for (let i = tabsList.length - 1; i >= 0; i--) { // ? 報錯:tabsList 是 Promise,無 lengthconst user = message.getUserInfo(tabsList[i].senderId); // 同樣返回 Promiseconst t = { ... }; // 此時 user 是未完成的 Promise,數據無效tempMessageList.push(t); // 填充無效數據}userMessageList.value = sortData(tempMessageList); // 數據混亂
};

? 具體問題

  1. Promise 未被解析tabsListtagsStateList 會直接返回 Promise 對象,而非實際數據。
  2. 循環邏輯崩潰:嘗試訪問 tabsList.length 時會報錯,因為 tabsList 是 Promise(沒有 length 屬性)。
  3. 數據無效message.getUserInfo 返回的 Promise 未被等待,user 變量將是一個未完成的 Promise,無法獲取 uidavatar 等字段。
  4. 最終結果錯誤tempMessageList 中填充的是 Promise 對象,而非真實數據,導致渲染或后續處理失敗。

三、如何正確優化?

方案一:保留 async/await(推薦)

保持原有邏輯,確保異步操作按順序執行:

const getUserMessagePlan = async () => {const [tabsList, tagsStateList] = await Promise.all([message.getTagesList(),message.getTagsStateList()]);// 并行請求優化(減少總耗時)// ...
};
方案二:改用 Promise.then() 鏈式調用

若不使用 async/await,需手動處理 Promise 鏈:

const getUserMessagePlan = () => {message.getTagesList().then(tabsList => message.getTagsStateList().then(tagsStateList => {const tempMessageList = [];const promises = tabsList.map((tab, i) => message.getUserInfo(tab.senderId).then(user => ({uid: user.uid,// ...})));return Promise.all(promises);})).then(tempMessageList => {userMessageList.value = sortData(tempMessageList);});
};

? 缺點:代碼嵌套復雜,可讀性差。


四、總結

? 必須使用異步控制async/awaitPromise.then() 是處理異步操作的唯一可靠方式。
? 刪除 async/await 的后果:數據未就緒時執行后續代碼,導致邏輯錯誤和渲染異常。
? 優化建議:若需提升性能,可并行請求(如 Promise.all),但不可省略異步控制關鍵字。

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

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

相關文章

設計模式 Day 5:夯實觀察者模式(Boost 實戰精講)

今天我們繼續深入觀察者模式的學習,不再局限于手寫的抽象結構,而是聚焦于真實項目中如何使用成熟框架(如 Boost.Signals2)高效落地觀察者模式。 本篇采用**“理論解析 問答講解 實戰用例”**結構,幫助你從設計思想到…

設計模式 Day 3:抽象工廠模式(Abstract Factory Pattern)詳解

經過前兩天的學習,我們已經掌握了單例模式與工廠方法模式,理解了如何控制實例個數與如何通過子類封裝對象的創建邏輯。 今天,我們將進一步深入“工廠”體系,學習抽象工廠模式(Abstract Factory Pattern)&a…

MySQL:事務的理解

一、CURD不加控制,會有什么問題 (1)因為,MySQL里面存的是數據,所以很有可能會被多個客戶訪問,所以mysqld可能一次會接受到多個關于CURD的請求。(2)且mysql內部是采用多線程來完成數…

藍橋杯刷題--寶石組合

在一個神秘的森林里,住著一個小精靈名叫小藍。有一天,他偶然發現了一個隱藏在樹洞里的寶藏,里面裝滿了閃爍著美麗光芒的寶石。這些寶石都有著不同的顏色和形狀,但最引人注目的是它們各自獨特的 “閃亮度” 屬性。每顆寶石都有一個…

DAY06:【pytorch】圖像增強

1、基本概念 數據增強,又稱數據增廣、數據擴增,是對訓練集進行變換,使訓練集更豐富,從而讓模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能:從圖像中心裁剪圖片 size:所需裁剪圖…

mysql 禁止 讀 某個 表

mysql 禁止 讀 某個 表 mysql禁用某張表,禁用MySQL表的操作 https://shuyeidc.com/wp/89479.html MySQL嚴格禁止讀取表如何避免數據泄露 https://www.kdun.cn/ask/394700.html select host,user from mysql.user; FLUSH PRIVILEGES; 1. MySQL嚴格禁止讀取表如何避免數據泄露…

機器學習 從入門到精通 day_03

1. KNN算法-分類 1.1 樣本距離判斷 明可夫斯基距離:歐式距離,明可夫斯基距離的特殊情況;曼哈頓距離,明可夫斯基距離的特殊情況。 兩個樣本的距離公式可以通過如下公式進行計算,又稱為歐式距離。 (…

LeetCode 熱題 100_零錢兌換(85_322_中等_C++)(動態規劃)

LeetCode 熱題 100_零錢兌換(85_322) 題目描述:輸入輸出樣例:題解:解題思路:思路一(動態規劃): 代碼實現代碼實現(思路一(動態規劃)&a…

游戲盾IP可以被破解嗎

游戲盾IP(如上海云盾SDK、騰訊云游戲盾)是專為游戲行業設計的高防服務,旨在抵御DDoS攻擊、CC攻擊等威脅。其安全性取決于??技術架構、防護能力??以及??運維策略??。雖然理論上沒有絕對“無法破解”的系統,但游戲盾IP在合理…

SpringBoot實戰1

SpringBoot實戰1 一、開發環境,環境搭建-----創建項目 通過傳統的Maven工程進行創建SpringBoot項目 (1)導入SpringBoot項目開發所需要的依賴 一個父依賴:(工件ID為:spring-boot-starter-parent&#xf…

【軟考-高級】【信息系統項目管理師】【論文基礎】進度管理過程輸入輸出及工具技術的使用方法

定義 項目進度管理是為了保證項目按時完成,對項目中所需的各個過程進行管理的過程,包括規劃進度、定義活動、活動優先級排序、活動持續時間、制定進度計劃和控制進度。 管理基礎 制定進度計劃的一般步驟 選擇進度計劃方法(如關鍵路徑法&a…

【Linux】之【Get】 chroot 環境下安裝deb包時 .postinst:行 9: 201 段錯誤 (核心已轉儲)ldconfig

背景 如題,在postinst文件中直接執行了ldconfig命令, chroot 環境下出錯,安裝失敗 分析 chroot 環境下不能用 ldconfig 和 systemctl 但是:如果環境是 chroot,系統有可能沒完整掛載 /proc、/dev、系統路徑&#xff…

【論文精讀與實現】EDC2-RAG:基于動態聚類的文檔壓縮方法提升檢索增強生成RAG性能

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 1. 論文核心思想 這篇由清華大學團隊提出的EDC-RAG框架,針對當前…

OSPF接口的網絡類型和不規則區域

網絡類型(數據鏈路層所使用的協議所構建的二層網絡類型) 1、MA --- 多點接入網絡 BMA --- 支持廣播的多點接入網絡 NBMA --- 不支持廣播的多點接入網絡 2、P2P --- 點到點網絡 以太網 --- 以太網最主要的特點是需要基于MAC地址進行物理尋址,主要是因為以太網接口所連…

HTTP代理:內容分發戰場上的「隱形指揮官」

目錄 一、技術本質:流量博弈中的「規則改寫者」 二、戰略價值:內容分發的「四維升級」 三、實戰案例:代理技術的「降維打擊」 四、未來進化:代理技術的「認知升級」 五、結語:代理技術的「戰略覺醒」 在數字內容爆…

(2)網絡學習之堡壘機

堡壘機和防火墻的區別: 1.功能定位 防火墻主要負責抵御外部攻擊,就像一道堅固的城墻,防止黑客進入內部網絡。堡壘機則專注于內部管理,監控和記錄運維人員的操作行為,確保內部網絡的安全。 2.部署位置與作用范圍 防…

minio命令行客戶端mc常見用法

安裝minio命令行客戶端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安裝minio命令行客戶端 choco install minio-client -y# Linux安裝mc客戶端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 賦予可…

idea調整控制臺日志顯示長度

概述 在調試時,idea控制臺顯示的日志有長度顯示,當顯示的日志太長時,后生成的日志會覆蓋掉之前生成的日志內容。想要調整長度就可以按以下方式進行設置。 設置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修復之路

很早以前寫的文章,再草稿中存放太久了,今天開始整理20年來工作體會,以后陸續發出,希望給大家提供小小的幫助。 去年做的項目使用的oracle數據庫,最近要看一下,啟動機器進入系統,出現無法加載數…

QT中怎么隱藏或顯示最大化、最小化、關閉按鈕

文章目錄 方法一:通過代碼動態設置1、隱藏最大化按鈕2、隱藏最小化按鈕3、隱藏關閉按鈕方法 1:移除 WindowCloseButtonHint方法 2:使用 Qt::CustomizeWindowHint 并手動控制按鈕 4、同時隱藏最大化和最小化按鈕5、同時隱藏最大化和關閉按鈕6、…