uniapp使用ui.request 請求流式輸出

正文:

????????在現代Web開發中,實時數據流和長時間運行的請求變得越來越常見,尤其是在處理大量數據或進行實時通信時。在這種情況下,uniapp 提供的 ui.request 請求方法可以幫助我們輕松實現流式輸出請求。本文將介紹如何使用 uni.request 來實現流式數據請求,并處理實時返回的數據。

一、項目背景

????????假設你正在開發一款移動端應用,其中需要向服務器發起請求,獲取大量文本數據,并且這些數據需要逐步輸出,而不是一次性返回所有結果。這時候,流式請求是一個非常理想的解決方案,它可以在數據準備好后立即傳輸,而不需要等待完整的數據返回。

二、核心代碼解析

????????在本篇博客中,我們將分享一個典型的實現流式請求的代碼示例,幫助大家理解如何在 uniapp 中使用 ui.request 實現流式輸出。

const requestTask = uni.request({url: '這是你的接口',method: 'post',header: {},enableChunked: true,  // 啟用分塊傳輸responseType: 'text', // 響應類型為文本data: {},success: (res) => {console.log(res, '文本');},fail: (err) => {console.error('請求失敗:', err);}
});// 處理流式輸出
requestTask.onChunkReceived((res) => {this.xianshi_tt = false//用來解析let uint8Array = new TextDecoder('utf-8')let decodedString = uint8Array.decode(res.data)let dataList = decodedString.split('\n\n')dataList.forEach((item) => {if (item) {let gg = JSON.parse(item.replace('data:', ''));let content = gg.choices[0]..reasoning_content;// 檢查 content 是否有效并且不為空if (content && content !== "" && content !== undefined) {// 檢查 content 是否已經存在于 streamData 中,防止重復if (!this.streamData.includes(content)) {this.streamData.push(content);}}}})// 轉換數組為字符串this.wenan_content = this.streamData.join(''); // 將數組轉化為換行分隔的字符串
});

三、關鍵參數解析

1.?enableChunked: true

在進行流式數據請求時,enableChunked: true 是一個非常關鍵的配置項。它允許我們啟用 HTTP 分塊傳輸(Chunked Transfer Encoding),這樣服務器可以在數據準備好時就開始傳輸,而不必等到整個響應完成。

2.?responseType: 'text'

responseType: 'text' 指定了我們接收的數據類型為文本格式。通常在處理流式輸出時,文本數據會更容易進行解析和處理。

3.?onChunkReceived

流式輸出的處理主要通過 onChunkReceived 方法來實現。每當服務器發送新的數據塊時,這個回調函數就會被觸發,里面的邏輯會逐步接收和處理這些數據。

  • TextDecoder?是用來將?Uint8Array?數據解碼為字符串的工具。在處理流式數據時,我們會獲取到分塊的字節流,需要將其解碼為字符串以便進一步操作。
  • 數據被解碼后,通過?split('\n\n')?將文本按段落進行拆分,每一段數據都會被處理。
4.?數據處理邏輯

我們從 gg.choices[0]..reasoning_content 中提取出需要的文本數據,然后進行一系列的檢查:

  • 確保內容有效(非空且未定義)。
  • 確保內容沒有重復。

最后,通過 this.streamData.push(content) 將內容添加到 streamData 數組中,形成完整的文本內容。

5.?拼接字符串

所有有效的內容都被存儲在 this.streamData 數組中。在數據流逐步輸出的過程中,最終會通過 this.wenan_content = this.streamData.join(''); 將數組中的所有內容拼接成一個完整的字符串,從而實現流式輸出。

四、流式請求的優勢

  1. 提高響應速度:?流式請求允許客戶端在數據逐步返回的過程中即時獲取并處理數據,而不需要等待完整的數據返回。
  2. 減少內存占用:?不需要將所有數據一次性加載到內存中,而是分批處理,可以有效減小內存壓力。
  3. 實時顯示:?對于用戶而言,流式輸出可以實現數據的實時顯示,提升用戶體驗。

五、總結

通過 uniapp 中的 ui.request 配合 enableChunked: true 配置,我們可以非常方便地實現流式輸出請求。這種方法適用于需要實時獲取和顯示大量數據的應用場景,能夠顯著提高應用的響應速度和用戶體驗。希望本文的代碼示例和解析能幫助你更好地理解流式請求的實現與應用。

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

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

相關文章

如何恢復被勒索軟件加密的服務器文件(解密與備份策略)

針對勒索軟件加密文件的恢復和解密策略,結合當前數據安全最佳實踐,整理應對指南如下: 一、文件解密與修復方法 立即隔離設備? 斷開網絡連接并禁用共享功能,防止病毒橫向傳播 通過文件后綴異常(如.locked、.wxx&…

JS,ES,TS三者什么區別

Java Script(JS)、ECMAScript(ES)、TypeScript(TS) 的核心區別與關聯的詳細解析,結合技術背景、設計目標及應用場景展開說明: 一、核心定義與關系 JavaScript(JS) 定義:一種動態類型、基于原型的腳本語言,由 Netscape 公司于 1995 年首次開發,用于網頁交互功能。角…

【MapReduce入門】深度解析MapReduce:定義、核心特點、優缺點及適用場景

目錄 1 什么是MapReduce? 2 MapReduce的核心特點 2.1 分布式處理 2.2 容錯機制 3 MapReduce的完整工作流程 4 MapReduce的優缺點分析 4.1 優勢 4.2 局限性 5 MapReduce典型應用場景 5.1 適用場景 5.2 不適用場景 6 MapReduce與其他技術的對比 7 總結 1…

【Redis】分布式鎖的實現

目錄 一、本地鎖存在的問題 二、redis實現分布式鎖原理 三、使用示例 四、鎖誤刪問題 解決思路 獲取鎖和釋放鎖代碼優化 五、鎖釋放的原子性問題 解決思路(Lua腳本) 使用流程 總結 大家好,我是千語。上期給大家講了使用悲觀鎖來解決…

Unity3D對象池設計與實現詳解

前言 在Unity3D中,對象池(Object Pooling)是一種優化技術,用于減少頻繁實例化和銷毀對象帶來的性能開銷。以下是對象池的詳細設計和實現步驟: 對惹,這里有一個游戲開發交流小組,希望大家可以點…

[Spring]-組件的生命周期

組件生命周期 認識組件的聲明周期 實驗1 通過Bean指定組件的生命周期 package com.guigu.spring.ioc.bean;Data public class User {private String username;private String password;private Car car;Autowiredpublic void setCar(Car car) {System.out.println("自動…

【golang】網絡數據包捕獲庫 gopacket

詳解 github.com/google/gopacket/pcap 包 github.com/google/gopacket/pcap 是 Go 語言中一個強大的網絡數據包捕獲庫,它是 gopacket 項目的一部分,提供了對 libpcap(Linux/Unix)和 WinPcap(Windows)的 G…

RBTree的模擬實現

1:紅黑樹的概念 紅?樹是?棵?叉搜索樹,他的每個結點增加?個存儲位來表?結點的顏?,可以是紅?或者??。通過對任何?條從根到葉?的路徑上各個結點的顏?進?約束,紅?樹確保沒有?條路徑會?其他路徑?出2倍,因…

React 第三十九節 React Router 中的 unstable_usePrompt Hook的詳細用法及案例

React Router 中的 unstable_usePrompt 是一個用于在用戶嘗試離開當前頁面時觸發確認提示的自定義鉤子,常用于防止用戶誤操作導致數據丟失(例如未保存的表單)。 一、unstable_usePrompt用途 防止意外離開頁面:當用戶在當前頁面有…

OSI 7層模型

OSI 7層模型: 1、物理層(光纖等把電腦連接起來的物理手段) 2、數據鏈路層(以太網,確認0和1電信號的分組方式,負責MAC地址,MAC地址用于在網絡中唯一標示一個網卡,相當于網卡的身份證…

視頻編解碼學習十一之視頻原始數據

一、視頻未編碼前的原始數據是怎樣的? 視頻在未編碼前的原始數據被稱為 原始視頻數據(Raw Video Data),主要是按照幀(Frame)來組織的圖像序列。每一幀本質上就是一張圖片,通常采用某種顏色格式…

Redis學習打卡-Day1-SpringDataRedis、有狀態無狀態

Redis的Java客戶端 Jedis 以 Redis 命令作為方法名稱,學習成本低,簡單實用。Jedis 是線程不安全的,并且頻繁的創建和銷毀連接會有性能損耗,因此推薦使用 Jedis 連接池代替Jedis的直連方式。 lettuce Lettuce是基于Netty實現的&am…

告別靜態配置!Spring Boo動態線程池實戰指南:Nacos+Prometheus全鏈路監控

一、引言 1.1 動態線程池的必要性 傳統線程池的參數(如核心線程數、隊列容量)通常通過配置文件靜態定義,無法根據業務負載動態調整。例如,在電商大促場景中,流量可能瞬間激增,靜態線程池容易因配置不合理導…

Flask如何讀取配置信息

目錄 一、使用 app.config 讀取配置 二、設置配置的幾種方式 1. 直接設置 2. 從 Python 文件加載 3. 從環境變量加載 4. 從字典加載 5. 從 .env 文件加載(推薦開發環境用) 三、讀取配置值 四、最佳實踐建議 在 Flask 中讀取配置信息有幾種常見方…

【React中useCallback鉤子詳解】

useCallback 是 React 中的一個性能優化 Hook,用于緩存函數引用,避免在組件重新渲染時重復創建相同的函數,從而減少不必要的子組件渲染或副作用執行。以下是其核心要點: 1. 核心作用 函數記憶化:返回一個記憶化的回調函數,僅在依賴項變化時重新創建函數,否則復用之前的函…

【!!!!終極 Java 中間件實戰課:從 0 到 1 構建億級流量電商系統全鏈路解決方案!!!!保姆級教程---超細】

終極 Java 中間件實戰課:電商系統架構實戰教程 電商系統架構實戰教程1. 系統架構設計1.1 系統模塊劃分1.2 技術選型2. 環境搭建2.1 開發環境準備2.2 基礎設施部署3. 用戶服務開發3.1 創建Maven項目3.2 創建用戶服務模塊3.3 配置文件3.4 實體類與數據庫設計3.5 DAO層實現3.6 Se…

C#異步Task,await,async和Unity同步協程

標題 TaskawaitasyncUnity協程 Task Task是聲明異步任務的必要關鍵字&#xff0c;也可以使用Task<>泛型來定義Task的返回值。 await await是用于等待一個Task結束&#xff0c;否則讓出該線程控制權&#xff0c;讓步給其他線程&#xff0c;直到該Task結束才往下運行。 …

【USRP】在linux下安裝python API調用

UHD 源碼安裝 安裝庫 sudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool \ g git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev \ libusb-dev python3-dev python3-mako …

什么是 NoSQL 數據庫?它與關系型數據庫 (RDBMS) 的主要區別是什么?

我們來詳細分析一下 NoSQL 數據庫與關系型數據庫 (RDBMS) 的主要區別。 什么是 NoSQL 數據庫&#xff1f; NoSQL (通常指 “Not Only SQL” 而不僅僅是 “No SQL”) 是一類數據庫管理系統的總稱。它們的設計目標是解決傳統關系型數據庫 (RDBMS) 在某些場景下的局限性&#xf…

藍橋杯題庫經典題型

1、數列排序&#xff08;數組 排序&#xff09; 問題描述 給定一個長度為n的數列&#xff0c;將這個數列按從小到大的順序排列。1<n<200 輸入格式 第一行為一個整數n。 第二行包含n個整數&#xff0c;為待排序的數&#xff0c;每個整數的絕對值小于10000。 輸出格式 輸出…