国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

EventSource 引發(fā)的一系列事件

這篇具有很好參考價值的文章主要介紹了EventSource 引發(fā)的一系列事件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

大家好,我是江辰,最近小小的實現(xiàn)了下 chatGPT 的問答式回復(fù),調(diào)研了前端如何實現(xiàn)這種問答式請求,有幾種方案,Http、EventSource、WebSocket,三種實現(xiàn)方案各有優(yōu)缺點,Http 和 WebSocket ,想必大家耳聞能詳,這里我講講 EventSource

EventSource

EventSource 是服務(wù)器推送的一個網(wǎng)絡(luò)事件接口。一個 EventSource 實例會對 HTTP 服務(wù)開啟一個持久化的連接,以text/event-stream 格式發(fā)送事件,會一直保持開啟直到被要求關(guān)閉。

一旦連接開啟,來自服務(wù)端傳入的消息會以事件的形式分發(fā)至你代碼中。如果接收消息中有一個事件字段,觸發(fā)的事件與事件字段的值相同。如果沒有事件字段存在,則將觸發(fā)通用事件。

與 WebSockets,不同的是,服務(wù)端推送是單向的。數(shù)據(jù)信息被單向從服務(wù)端到客戶端分發(fā)。當(dāng)不需要以消息形式將數(shù)據(jù)從客戶端發(fā)送到服務(wù)器時,這使它們成為絕佳的選擇。例如,對于處理社交媒體狀態(tài)更新,新聞提要或?qū)?shù)據(jù)傳遞到客戶端存儲機制(如 IndexedDB 或 Web 存儲)之類的,EventSource 無疑是一個有效方案。

— 引自 MDN

對比 WebSocket,它就是簡單,方便,在特定的一些場景下,比如聊天消息或市場價格,這就是 EventSource 擅長的

使用方式

它的使用方式極其簡單

const evtSource = new EventSource('sse.php');
const eventList = document.querySelector('ul');

evtSource.onmessage = function(e) {
 let newElement = document.createElement("li");

  newElement.textContent = "message: " + e.data;
  eventList.appendChild(newElement);
}

對吧,幾行代碼搞定,如何攜帶參數(shù),在 new EventSource('sse.php?id=123'); 其中 id=123,就是我們要給鏈接傳的參數(shù)

問題來了

EventSource 引發(fā)的一系列事件,前端

當(dāng)我實現(xiàn)之后,發(fā)現(xiàn)它在不斷的自動重連?搜了很多文檔,想不通,為何會自動重連,這里伏筆。想不通,ok,我就換個思路,改用 Axios 實現(xiàn)

axios

axios 實現(xiàn)如下

const streamToString = async (readableStream) => {
  return new Promise((resolve, reject) => {
    const chunks = [];
    readableStream.on("data", (data) => {
      chunks.push(data);
    });
    readableStream.on("end", () => {
      resolve(Buffer.concat(chunks).toString('base64'))
    });
    readableStream.on("error", reject);
  });
}


axios({
  method: 'get',
  url:`//xxx/api/chat/stream?prompt=${textarea.current.value.trim()}`,
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  responseType: 'stream'
}).then(async res => {
  const raw = await streamToString(res.data);
})

此時還不知問題的**嚴(yán)重性!**實現(xiàn)完之后,發(fā)現(xiàn)不對勁啊,readableStream.on is not a fucntion,???(黑人問號臉),遂打印 log 看看輸出的 res.data 是啥,字符串?根本不是一個方法啊,但看網(wǎng)上實現(xiàn),是這樣啊,沒錯?又看了幾遍,都是這樣實現(xiàn)的,很懵,直到看了下 axios 的 issue,傳送門,2016年就有人提出了這個問題,也就是說 axios 在瀏覽器側(cè)一直沒有實現(xiàn) steram,我內(nèi)心cnm,網(wǎng)上的文檔都是假的?。?!

也就是說,按照目前MDN說法,responseType 支持的類型有,arraybuffer、blob、document、json、text、ms-stream,其中 ms-stream,此響應(yīng)類型僅允許用于下載請求,并且僅受 Internet Explorer 支持

坑坑坑,又要開始了其他方案,想想 Fetch 能不能行,瀏覽器原生支持哦!

Fetch

Fetch API 提供了一個 JavaScript 接口,用于訪問和操縱 HTTP 管道的一些具體部分,例如請求和響應(yīng)。它還提供了一個全局 fetch() 方法,該方法提供了一種簡單,合理的方式來跨網(wǎng)絡(luò)異步獲取資源。

這種功能以前是使用 XMLHttpRequest 實現(xiàn)的。Fetch 提供了一個更理想的替代方案,可以很容易地被其他技術(shù)使用,例如 Service Workers。Fetch 還提供了專門的邏輯空間來定義其他與 HTTP 相關(guān)的概念,例如 CORS 和 HTTP 的擴展。

— 引自 MDN

利用 Fetch 實現(xiàn)了如下代碼

const response = await fetch(`//xxx/api/chat/stream?prompt=${textarea.current.value.trim()}`);
const reader = response.body.getReader();

const eventList = document.querySelector('ul');
while (true) {
  const { value, done } = await reader.read();
  const utf8Decoder = new TextDecoder('utf-8');
  let data: any = value ? utf8Decoder.decode(value, {stream: true}) : '';
  try {
    data = JSON.parse(data)
    if (data.id || !data.content) {
      return
    }

    let newElement = document.createElement("li");
    newElement.textContent = "message: " + data.content;
    eventList.appendChild(newElement);
  } catch (e) {
  }
  if (done) {
    break;
  }
}

實現(xiàn)沒有問題,在我電腦上也跑通了,能穩(wěn)定接收服務(wù)端消息,不會自動重連,萬事大吉,轉(zhuǎn)交朋友試用
。。。。

交給朋友試用,反饋說,會出現(xiàn)回復(fù)不全???,調(diào)試搞起

瀏覽器側(cè)接收的消息
EventSource 引發(fā)的一系列事件,前端

抓包看的消息
EventSource 引發(fā)的一系列事件,前端

對比看,瀏覽器側(cè)**丟包!丟包了?。。?*幾番排查下來,不知為何會丟包,而且是只有 Windows 上會丟包(必現(xiàn)),macOS 上不會,不懂了呀,我們自己測試 Win 下 ping 都是穩(wěn)定的,有懂的同學(xué),可以告知下,謝謝!

最終解決方案

又回到 EventSource,沒錯,又回來了,折騰下來發(fā)現(xiàn),每次收完消息,你必須手動關(guān)閉下,evtSource.close();,才不會自動重連,而且自動重連就是 EventSource 的特性之一,害,伏筆解決了。這個關(guān)閉有個前提是,服務(wù)端下發(fā)字段告訴你,能關(guān)閉,你才能關(guān)閉哦,折騰啊?。?!

總結(jié)

通過這次的學(xué)習(xí),讓我對 EventSource 以及 Fetch、Axios 有了一次深刻的認知,大家看完覺得還不錯的話,歡迎點贊,收藏哦
文章同步更新平臺:掘金、CSDN、知乎、思否、博客,公眾號(野生程序猿江辰)

我的聯(lián)系方式,v:Jiang9684,歡迎和我一起學(xué)習(xí)交流

本文由mdnice多平臺發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-692081.html

到了這里,關(guān)于EventSource 引發(fā)的一系列事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 網(wǎng)絡(luò)安全領(lǐng)域關(guān)鍵信息泄露事件引發(fā)關(guān)注

    網(wǎng)絡(luò)安全領(lǐng)域關(guān)鍵信息泄露事件引發(fā)關(guān)注

    近日,一家知名網(wǎng)絡(luò)安全公司發(fā)布了一份報告揭露了一起重大信息泄露事件。據(jù)稱,該事件涉及大量敏感用戶數(shù)據(jù)的泄露引發(fā)了全球網(wǎng)絡(luò)安全領(lǐng)域的廣泛關(guān)注。 根據(jù)報道,該事件發(fā)生在全球范圍內(nèi)涉及多個國家和組織。專家指出,此次泄露事件的規(guī)模和影響力令人震驚突顯了

    2024年02月09日
    瀏覽(22)
  • 服務(wù)器給前端實時推送數(shù)據(jù)輕量化解決方案eventSource+Springboot

    服務(wù)器給前端實時推送數(shù)據(jù)輕量化解決方案eventSource+Springboot

    body代碼 js代碼 WebFlux 框架依賴jar包 控制器代碼 Flux.interval(Duration.ZERO,Duration.ofSeconds(1)),等待0秒開始,間隔1秒,F(xiàn)lux流數(shù)據(jù)里面的數(shù)字加1 三、效果展示 時間和數(shù)字一直在增加,后端在不斷推送,前端訂閱到數(shù)據(jù)更新到頁面 相對于websocket簡單很多,只需要很少的代碼就實現(xiàn)前

    2024年04月11日
    瀏覽(35)
  • 數(shù)據(jù)隱私保護:網(wǎng)站文章采集txt事件引發(fā)的用戶隱私安全風(fēng)險

    數(shù)據(jù)隱私保護:網(wǎng)站文章采集txt事件引發(fā)的用戶隱私安全風(fēng)險

    近期,以“網(wǎng)站文章采集txt”為名義的企業(yè)因涉嫌非法收集用戶數(shù)據(jù)而掀起一陣公眾爭議。該事件再度聚焦于數(shù)據(jù)隱私保護的議題。接下來,本文將深度剖析這一問題的實質(zhì)。 1.采集行為遭到質(zhì)疑 據(jù)悉,網(wǎng)站文章采集txt公司因涉嫌非法獲取用戶信息及進行商業(yè)利用而遭受指控

    2024年04月08日
    瀏覽(23)
  • Cocos Creator3.8 項目實戰(zhàn)(二)cocos creator編輯器中綁定事件引發(fā)的bug解決

    問題描述: 編輯器里面多個按鈕綁定同一個腳本,并配置事件,腳本中有其他消息監(jiān)聽,引起邏輯混亂。 問題原因: 編輯器里面多個按鈕綁定同一個腳本, 每次綁定一個按鈕事件,就會導(dǎo)致加載一次腳本 ,如上綁定了多個按鈕的事件,腳本也就被加載多次,導(dǎo)致初始化接

    2024年02月07日
    瀏覽(39)
  • 瀏覽器緩存引發(fā)的odoo前端報錯

    瀏覽器緩存引發(fā)的odoo前端報錯

    前兩天,跑了一個odoo16項目,莫名其妙的前端報錯, moment.js 報的錯, 這是一個時間庫,不是我自己寫的代碼,我也沒做過任何修改,搞不清楚為什么報錯。以為是odoo的bug,所以從gitee下載了odoo16最新的代碼,測試了一下還是報錯。 后來換成了一個非常老的odoo16版本,這回不

    2024年02月02日
    瀏覽(38)
  • [pyqt5]動態(tài)加載ui文件并給菜單的一個子菜單添加觸發(fā)事件

    [pyqt5]動態(tài)加載ui文件并給菜單的一個子菜單添加觸發(fā)事件

    場景:大家都知道如果直接將ui文件轉(zhuǎn)成py文件后,如果產(chǎn)品經(jīng)理要你加一些界面控件,你就得改轉(zhuǎn)換后代碼這樣很麻煩,我們可以直接加載ui文件,然后編寫觸發(fā)事件,因此寫了一個簡單案例,證明切實可行,首先我們設(shè)計一個簡單界面,就是加一個菜單-writer就可以了 ?然后

    2024年02月12日
    瀏覽(19)
  • 和前端吵架的一天

    和前端吵架的一天

    前段時間在開發(fā)公司的積分商城,前期都沒啥問題,一切都很順利,到了跟前端聯(lián)調(diào)的時候,尷尬了,吵起來了,搞得我很不爽,具體原因如下: 大致原因是:他說 get 請求攜帶body他那里處理不了,我就很奇怪了,為什么試配不了,當(dāng)時很無語,一口咬定就覺得是他的問題,

    2023年04月08日
    瀏覽(23)
  • 關(guān)于括號的一系列問題

    對于只出現(xiàn)一種括號的字符串,看這個字符串中的括號是否匹配 以及 匹配的個數(shù): 一般來說有兩種匹配方式: 例如: (()()()) 第一種匹配是此字符串有4組括號對匹配完成 第二種匹配是此字符串有3組括號對匹配完成 對于第一種匹配方式:有兩種選擇:?;蛘咧苯?/p>

    2024年02月11日
    瀏覽(20)
  • 安裝fasttext的一系列問題(全)

    安裝fasttext的一系列問題(全)

    環(huán)境配置:windows10+python3.10 前言:Gensim中的fasttext不能做文本分類,對于想學(xué)習(xí)fasttext進行文本分類、情感分析的同學(xué)還是必須下載Facebook的fasttext 在該python libs (或者粘貼該鏈接https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext)搜索fasttext 下載whl文件,文件名: fasttext-0.9.2-cp310-cp31

    2024年02月06日
    瀏覽(40)
  • RabbitMQ啟動失敗的一系列嘗試

    RabbitMQ啟動失敗的一系列嘗試

    在三臺 CentOS 7.x上部署了RabbitMQ集群,如下: ?服務(wù)器IP hostname 節(jié)點說明 端口 管控臺地址 192.168.31.101 master rabbitmq master 5672 http://192.168.11.71:15672 192.168.31.102 slave1 rabbitmq slave 5672 http://192.168.11.72:15672 192.168.31.103 slave2 rabbitmq slave 5672 http://192.168.11.73:15672 集群部署教程可參考:Rabb

    2024年02月04日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包