最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文解析ChatGPT?之?Fetch?請(qǐng)求

 更新時(shí)間:2023年03月31日 12:14:54   作者:川、  
這篇文章主要為大家介紹了ChatGPT?之?Fetch請(qǐng)求的內(nèi)容解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

SSE 介紹

隨著 ChatGPT 已生活工作中的一部分,介紹其中一種服務(wù)器端推送技術(shù)——Server-Sent Events (SSE),并簡(jiǎn)單實(shí)現(xiàn)其效果。

SSE 是一種 HTML5 技術(shù),它允許服務(wù)器向客戶(hù)端發(fā)送事件,從而實(shí)現(xiàn)服務(wù)器端推送。相對(duì)于 WebSockets 或長(zhǎng)輪詢(xún)技術(shù),SSE 提供了更簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)服務(wù)器端推送,并且支持更廣泛的客戶(hù)端和服務(wù)器端。

在 SSE 中,客戶(hù)端通過(guò)向服務(wù)器端發(fā)送一個(gè) HTTP 請(qǐng)求,請(qǐng)求某個(gè)資源,并且指定響應(yīng)的類(lèi)型是"text/event-stream"。服務(wù)器端在響應(yīng)請(qǐng)求時(shí),將數(shù)據(jù)格式化為事件流的形式,并通過(guò) HTTP 響應(yīng)發(fā)送回客戶(hù)端??蛻?hù)端通過(guò)事件流中的數(shù)據(jù),可以實(shí)現(xiàn)實(shí)時(shí)地更新 UI 等操作。

下面是一個(gè) SSE 的 Demo,展示了如何通過(guò) SSE 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)器端推送應(yīng)用。

服務(wù)端代碼:

const express = require('express');
const app = express();
const port = 3600;
app.get('/stream', (req, res) => {
  const { message = '' } = req.query
  // 3個(gè)請(qǐng)求頭重點(diǎn),需要返回text/event-stream,告知瀏覽器以何種類(lèi)型解析
  res.set({
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });
  let step = 0;
  // 定時(shí)器依次返回message
  const time = setInterval(() => {
    const data = { message: message[step++]};
    // 每個(gè)消息以 \n\n分割
    res.write(`data: ${JSON.stringify(data)}\n\n`);
    if (step > message.length - 1) {
      res.end()
      clearInterval(time)
    }
  }, 500);
});
app.listen(port, () => console.log(`Server running at http://localhost:${port}`));

客戶(hù)端代碼:

// 創(chuàng)建一個(gè)EventSource
const eventSource = new EventSource(`/stream?message=${message}`);
// 監(jiān)聽(tīng)服務(wù)器返回的數(shù)據(jù)
eventSource.onmessage = function (event) {
  console.log(event.data);
};
eventSource.onerror = function () {
  eventSource.close();
};

在上面的代碼中,我們通過(guò) EventSource 對(duì)象創(chuàng)建了一個(gè) SSE 連接,并指定了服務(wù)器端的 URL。當(dāng)有事件流數(shù)據(jù)時(shí),onmessage 回調(diào)函數(shù)會(huì)被調(diào)用。 network 中可看到一條類(lèi)型為eventsource的請(qǐng)求,其以下內(nèi)容

咋和 ChatGPT 控制臺(tái)看到的內(nèi)容不一樣???

ChatGPT 回車(chē)后,并未發(fā)送eventsource請(qǐng)求,而是發(fā)送了一個(gè) fetch 請(qǐng)求,原因又是什么呢,仔細(xì)看

觀察上圖可得它發(fā)送了一個(gè) fetch 的 POST 請(qǐng)求,服務(wù)端響應(yīng)的是一個(gè)eventsource,那么 fetch 又能如何實(shí)現(xiàn)eventsource響應(yīng)呢?因?yàn)?fetch 并沒(méi)有onmessage方法~

通過(guò)一番查找學(xué)習(xí)~主要有兩個(gè)關(guān)鍵的 API

fetch用于發(fā)起SSE請(qǐng)求,而EventSource用于處理服務(wù)器端推送的數(shù)據(jù)。結(jié)合兩個(gè)API簡(jiǎn)單實(shí)現(xiàn)一個(gè)fetchStream方法

const fetchStream = (url, params) => {
  const { onmessage, onclose, ...otherParams } = params;
  const push = async (controller, reader) => {
    const { value, done } = await reader.read();
    if (done) {
      controller.close();
      onclose?.();
    } else {
      onmessage?.(Uint8ArrayToString(value));
      controller.enqueue(value);
      push(controller, reader);
    }
  };
  // 發(fā)送請(qǐng)求
  return fetch(url, otherParams)
    .then((response) => {
      // 以ReadableStream解析數(shù)據(jù)
      const reader = response.body.getReader();
      const stream = new ReadableStream({
        start(controller) {
          push(controller, reader);
        },
      });
      return stream;
    })
    .then((stream) => new Response(stream, { headers: { 'Content-Type': 'text/html' } }).text());
};

調(diào)用方法

fetchStream(`/stream?message=${message}`, {
  method: 'GET',
  headers: {
    'accept': 'text/event-stream',
    'Content-Type': 'application/json',
  },
  onmessage: (res) => {
    // todo
    console.log(res);
  },
});

經(jīng)過(guò)簡(jiǎn)單封裝實(shí)現(xiàn)ChatGPT的應(yīng)答請(qǐng)求效果~

另外推薦一個(gè)成熟的第三方依賴(lài)fetch-event-source 點(diǎn)擊查看

Server-Sent Events 相對(duì)于其他技術(shù)的優(yōu)缺點(diǎn)

與WebSockets相比,SSE技術(shù)的優(yōu)點(diǎn)在于

  • 更簡(jiǎn)單的實(shí)現(xiàn):SSE技術(shù)使用標(biāo)準(zhǔn)的HTTP協(xié)議來(lái)發(fā)送和接收數(shù)據(jù),因此不需要額外的握手和協(xié)議協(xié)商步驟。這使得SSE技術(shù)的實(shí)現(xiàn)更加簡(jiǎn)單,尤其是對(duì)于服務(wù)器端。
  • 更廣泛的兼容性:SSE技術(shù)使用標(biāo)準(zhǔn)的HTTP協(xié)議,因此可以被大多數(shù)Web瀏覽器和服務(wù)器端支持。相比之下,WebSockets需要瀏覽器和服務(wù)器端都支持WebSocket協(xié)議。
  • 更少的網(wǎng)絡(luò)開(kāi)銷(xiāo):SSE技術(shù)使用HTTP長(zhǎng)連接來(lái)實(shí)現(xiàn)服務(wù)器端推送,因此相比WebSockets需要更少的網(wǎng)絡(luò)開(kāi)銷(xiāo)和資源消耗。

與長(zhǎng)輪詢(xún)技術(shù)相比,SSE技術(shù)的優(yōu)點(diǎn)在于

  • 實(shí)時(shí)性更好:SSE技術(shù)可以實(shí)時(shí)地向客戶(hù)端推送數(shù)據(jù),因此可以實(shí)現(xiàn)更快的響應(yīng)速度和更好的實(shí)時(shí)性。
  • 更少的網(wǎng)絡(luò)開(kāi)銷(xiāo):SSE技術(shù)使用HTTP長(zhǎng)連接來(lái)實(shí)現(xiàn)服務(wù)器端推送,因此相比長(zhǎng)輪詢(xún)需要更少的網(wǎng)絡(luò)開(kāi)銷(xiāo)和資源消耗。
  • 更好的客戶(hù)端兼容性:SSE技術(shù)可以被大多數(shù)現(xiàn)代瀏覽器和設(shè)備支持,因此更容易實(shí)現(xiàn)客戶(hù)端兼容性。

總結(jié)

最后呈上一個(gè)完整的demo,github地址

以上就是一文解析ChatGPT 之 Fetch 請(qǐng)求的詳細(xì)內(nèi)容,更多關(guān)于ChatGPT Fetch 請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)通過(guò)js操作wxml的wxss屬性示例

    微信小程序?qū)崿F(xiàn)通過(guò)js操作wxml的wxss屬性示例

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)通過(guò)js操作wxml的wxss屬性,結(jié)合實(shí)例形式分析了微信小程序使用js操作wxml的wxss屬性相關(guān)原理、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • javascript限制文本框輸入值類(lèi)型的方法

    javascript限制文本框輸入值類(lèi)型的方法

    這篇文章主要介紹了javascript限制文本框輸入值類(lèi)型的方法,涉及javascript鼠標(biāo)事件、鍵盤(pán)按鍵及字符串的相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 原生JavaScript實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    原生JavaScript實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼注釋的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 使用TS來(lái)編寫(xiě)express服務(wù)器的方法步驟

    使用TS來(lái)編寫(xiě)express服務(wù)器的方法步驟

    這篇文章主要介紹了使用TS來(lái)編寫(xiě)express服務(wù)器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 微信小程序tabBar 返回tabBar不刷新頁(yè)面

    微信小程序tabBar 返回tabBar不刷新頁(yè)面

    這篇文章主要介紹了微信小程序tabBar 返回tabBar不刷新頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 利用JS實(shí)現(xiàn)搶紅包的三種算法

    利用JS實(shí)現(xiàn)搶紅包的三種算法

    對(duì)于搶紅包來(lái)說(shuō)最重要的就是隨機(jī)性算法,如何確保每個(gè)人獲得金額是趨向于平均的,也就是有平均的概率去隨機(jī),而盡量避免兩極分化,本文給大家介紹了用JS實(shí)現(xiàn)搶紅包的三種算法,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2024-03-03
  • 求數(shù)組最大最小值方法適用于任何數(shù)組

    求數(shù)組最大最小值方法適用于任何數(shù)組

    之前雖然介紹過(guò)一種求數(shù)組最大最小值的方法,但那個(gè)方法只是用于數(shù)組中都是數(shù)字的,下面為大家介紹個(gè)方法適用于任何數(shù)組,有此需求的朋友可以參考下
    2013-08-08
  • 微信小程序開(kāi)發(fā)WXML模板語(yǔ)法基礎(chǔ)教程

    微信小程序開(kāi)發(fā)WXML模板語(yǔ)法基礎(chǔ)教程

    這篇文章主要介紹了微信小程序模板語(yǔ)法,WXML(WeiXin?Markup?Language)是框架設(shè)計(jì)的一套標(biāo)簽語(yǔ)言,結(jié)合基礎(chǔ)組件、事件系統(tǒng),可以構(gòu)建出頁(yè)面的結(jié)構(gòu),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Pro JavaScript Techniques學(xué)習(xí)筆記

    Pro JavaScript Techniques學(xué)習(xí)筆記

    Pro JavaScript Techniques學(xué)習(xí)筆記,學(xué)習(xí)js的朋友可以參考下。
    2010-12-12
  • webpack3升級(jí)到webpack4遇到問(wèn)題總結(jié)

    webpack3升級(jí)到webpack4遇到問(wèn)題總結(jié)

    這篇文章主要介紹了webpack3升級(jí)到webpack4遇到問(wèn)題總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

齐齐哈尔市| 时尚| 武宣县| 永年县| 盈江县| 新泰市| 宜都市| 岢岚县| 电白县| 太谷县| 酒泉市| 新兴县| 珲春市| 奈曼旗| 上林县| 宜兰市| 沙坪坝区| 峡江县| 永清县| 祁东县| 竹北市| 夏津县| 营山县| 沙雅县| 东丽区| 平阴县| 绿春县| 乌拉特前旗| 平乐县| 兴义市| 文化| 肥西县| 恩施市| 宜章县| 渝北区| 陕西省| 祁门县| 德庆县| 连平县| 江西省| 濮阳县|