AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

前端JS發(fā)起的請(qǐng)求能暫停嗎?

來(lái)源: 責(zé)編: 時(shí)間:2024-06-12 08:45:29 140觀(guān)看
導(dǎo)讀在討論前端JS發(fā)起的請(qǐng)求是否能暫停時(shí),需要明確兩個(gè)概念:什么狀態(tài)可以被認(rèn)為是“暫停”?以及什么是JS發(fā)起的請(qǐng)求?如何定義暫停?暫停指的是臨時(shí)停止一個(gè)已經(jīng)開(kāi)始但尚未完成的過(guò)程。這意味著這個(gè)過(guò)程可以在某個(gè)時(shí)間點(diǎn)被中斷,并

iSz28資訊網(wǎng)——每日最新資訊28at.com

在討論前端JS發(fā)起的請(qǐng)求是否能暫停時(shí),需要明確兩個(gè)概念:什么狀態(tài)可以被認(rèn)為是“暫停”?以及什么是JS發(fā)起的請(qǐng)求?iSz28資訊網(wǎng)——每日最新資訊28at.com

如何定義暫停?

暫停指的是臨時(shí)停止一個(gè)已經(jīng)開(kāi)始但尚未完成的過(guò)程。這意味著這個(gè)過(guò)程可以在某個(gè)時(shí)間點(diǎn)被中斷,并在另一個(gè)時(shí)間點(diǎn)恢復(fù)。iSz28資訊網(wǎng)——每日最新資訊28at.com

什么是請(qǐng)求?

首先,讓我們介紹一下TCP/IP網(wǎng)絡(luò)模型。網(wǎng)絡(luò)模型從上到下分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。iSz28資訊網(wǎng)——每日最新資訊28at.com

iSz28資訊網(wǎng)——每日最新資訊28at.com

上圖表示,每次網(wǎng)絡(luò)傳輸,應(yīng)用數(shù)據(jù)都需要通過(guò)網(wǎng)絡(luò)模型逐層打包,然后發(fā)送到目的地,就像寄包裹一樣。要寄送的物品首先被包裝并登記其大小,然后放入箱子并登記目的地,最后裝上運(yùn)輸工具送到目的地。iSz28資訊網(wǎng)——每日最新資訊28at.com

請(qǐng)求的概念可以理解為客戶(hù)端通過(guò)多次數(shù)據(jù)網(wǎng)絡(luò)傳輸將完整數(shù)據(jù)發(fā)送到服務(wù)器,而服務(wù)器為特定請(qǐng)求返回的數(shù)據(jù)可以稱(chēng)為響應(yīng)。iSz28資訊網(wǎng)——每日最新資訊28at.com

理論上,應(yīng)用層協(xié)議可以通過(guò)標(biāo)記數(shù)據(jù)包序列號(hào)來(lái)實(shí)現(xiàn)暫停機(jī)制。然而,TCP協(xié)議不支持這一點(diǎn)。TCP協(xié)議的數(shù)據(jù)傳輸是面向流的,數(shù)據(jù)被視為連續(xù)的字節(jié)流。客戶(hù)端發(fā)送的數(shù)據(jù)將被分成多個(gè)獨(dú)立傳輸?shù)腡CP段。無(wú)法直接控制每個(gè)TCP段的傳輸,因此無(wú)法實(shí)現(xiàn)暫停請(qǐng)求或響應(yīng)的功能。iSz28資訊網(wǎng)——每日最新資訊28at.com

iSz28資訊網(wǎng)——每日最新資訊28at.com

回答問(wèn)題

如果請(qǐng)求指的是網(wǎng)絡(luò)模型中的傳輸,那么自然是不可能暫停的。iSz28資訊網(wǎng)——每日最新資訊28at.com

考慮到使用場(chǎng)景——由JS發(fā)起的請(qǐng)求。因此,可以認(rèn)為這里的問(wèn)題指的是在JS運(yùn)行時(shí)發(fā)起的XMLHttpRequest或fetch請(qǐng)求。由于請(qǐng)求已經(jīng)發(fā)出,問(wèn)題自然變成響應(yīng)是否可以暫停。iSz28資訊網(wǎng)——每日最新資訊28at.com

我們都知道,上傳大文件分片和下載大文件本質(zhì)上是定義分片順序,按順序請(qǐng)求,可以通過(guò)中斷和記錄中斷點(diǎn)來(lái)實(shí)現(xiàn)暫停和恢復(fù)。然而,單個(gè)請(qǐng)求并沒(méi)有這樣的環(huán)境。iSz28資訊網(wǎng)——每日最新資訊28at.com

使用JS實(shí)現(xiàn)“假暫停”機(jī)制

雖然我們無(wú)法真正實(shí)現(xiàn)暫停請(qǐng)求,但我們可以模擬一個(gè)假暫停功能。在前端業(yè)務(wù)場(chǎng)景中,數(shù)據(jù)在接收到后不會(huì)立即顯示在客戶(hù)端。前端開(kāi)發(fā)人員需要先處理這些數(shù)據(jù),然后再渲染到界面上。如果我們?cè)诎l(fā)起請(qǐng)求前添加一個(gè)控制器,并且在請(qǐng)求返回時(shí)該控制器處于暫停狀態(tài),則不處理數(shù)據(jù)。相反,等待控制器恢復(fù)后再處理數(shù)據(jù)。這樣我們是否就達(dá)到了目標(biāo)呢?讓我們嘗試實(shí)現(xiàn)它。iSz28資訊網(wǎng)——每日最新資訊28at.com

如果我們使用 fetch 發(fā)起請(qǐng)求,可以設(shè)計(jì)一個(gè)控制器 Promise,并結(jié)合請(qǐng)求使用 Promise.all 封裝。當(dāng) fetch 完成時(shí),檢查控制器是否處于暫停狀態(tài);如果沒(méi)有暫停,直接resolve 控制器并同時(shí) resolve 和拋出 Promise.all。iSz28資訊網(wǎng)——每日最新資訊28at.com

function _request () {  return new Promise<number>((res) => setTimeout(() => {    res(123)  }, 3000))}// 原本想用 "class extends Promise" 實(shí)現(xiàn)。// 問(wèn)題在于https://github.com/nodejs/node/issues/13678。function createPauseControllerPromise () {  const result = {    isPause: false,    resolveWhenResume: false,    resolve (value?: any) {},    pause () {      this.isPause = true    },    resume () {      if (!this.isPause) return      this.isPause = false      if (this.resolveWhenResume) {          this.resolve()      }    },    promise: Promise.resolve()  }    const promise = new Promise<void>((res) => {    result.resolve = res  })    result.promise = promise  return result}function requestWithPauseControl <T extends () => Promise<any>>(request: T) {  const controller = createPauseControllerPromise()    const controlRequest = request().then((data) => {      if (!controller.isPause) controller.resolve()      controller.resolveWhenResume = controller.isPause      return data  })    const result = Promise.all([controlRequest, controller.promise])      .then(data => data[0])        result.finally(() => controller.resolve())    (result as any).pause = controller.pause.bind(controller);  (result as any).resume = controller.resume.bind(controller);    return result as ReturnType<T> & { pause: () => void, resume: () => void }}

使用方法

我們可以將調(diào)用 _request 替換為調(diào)用 requestWithPauseControl(_request) ,并通過(guò)返回的pause和 resume 方法控制暫停和恢復(fù)。iSz28資訊網(wǎng)——每日最新資訊28at.com

const result = requestWithPauseControl(_request).then((data) => {    console.log(data)})if (Math.random() > 0.5) { result.pause() }setTimeout(() => {    result.resume()}, 4000)

執(zhí)行原理

在流程設(shè)計(jì)上,步驟如下:設(shè)計(jì)一個(gè)控制器,發(fā)起請(qǐng)求,在接收到響應(yīng)后,檢查控制器的狀態(tài)。如果控制器不處于“暫停”狀態(tài),則正常返回?cái)?shù)據(jù);如果控制器處于“暫停”狀態(tài),則將控制器設(shè)置為一旦調(diào)用resume方法就返回?cái)?shù)據(jù)的狀態(tài)。iSz28資訊網(wǎng)——每日最新資訊28at.com

在代碼中,使用 Promise.all 將控制器 Promise 綁定。如果控制器處于暫停狀態(tài),Promise.all 不會(huì)被釋放。然后對(duì)應(yīng)地暴露 pause 方法和 resume 方法供外部使用。iSz28資訊網(wǎng)——每日最新資訊28at.com

最后

有些人可能誤以為網(wǎng)絡(luò)請(qǐng)求和響應(yīng)根本無(wú)法暫停。我在文章開(kāi)頭特別提到了數(shù)據(jù)傳輸相關(guān)的內(nèi)容,并加了一句“理論上,應(yīng)用層協(xié)議可以通過(guò)標(biāo)記數(shù)據(jù)包序列號(hào)來(lái)實(shí)現(xiàn)暫停機(jī)制”。這意味著,如果你修改HTTP或設(shè)計(jì)自己的應(yīng)用層協(xié)議(例如socket、vmess等協(xié)議),只要雙方支持該協(xié)議,就可以實(shí)現(xiàn)請(qǐng)求或響應(yīng)的暫停。這不會(huì)影響TCP連接,但實(shí)現(xiàn)暫停機(jī)制需要綜合考慮場(chǎng)景和TCP策略,以確保更好的可靠性。iSz28資訊網(wǎng)——每日最新資訊28at.com

例如,提供一種控制消息類(lèi)型來(lái)控制傳輸暫停,需要標(biāo)記所有數(shù)據(jù)包的序列號(hào)。當(dāng)需要暫停時(shí),發(fā)送帶有序列號(hào)的暫停消息到接收端。接收端收到暫停消息后,將已收到的數(shù)據(jù)包標(biāo)記塊返回給發(fā)送端(類(lèi)似分片上傳機(jī)制)。iSz28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-93208-0.html前端JS發(fā)起的請(qǐng)求能暫停嗎?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 網(wǎng)易面試:SpringBoot如何開(kāi)啟虛擬線(xiàn)程?

下一篇: C# 實(shí)現(xiàn)動(dòng)態(tài)訪(fǎng)問(wèn) WebService,兼容 .NET Framework 和 .NET Core

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競(jìng)品的一加也坐不住了。一加中國(guó)區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 6月iOS設(shè)備好評(píng)榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個(gè),2023年6月的iOS好評(píng)榜和上個(gè)月相比沒(méi)有任何排名上的變化,僅僅是部分設(shè)備好評(píng)率的下降,長(zhǎng)年累月的用戶(hù)評(píng)價(jià)和逐漸退出市場(chǎng)的老款機(jī)器讓這
  • 十個(gè)可以手動(dòng)編寫(xiě)的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當(dāng),會(huì)很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對(duì)它們進(jìn)行一次小總結(jié)。現(xiàn)在開(kāi)始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問(wèn)題之一。隨著之家用戶(hù)體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿(mǎn)足用
  • JVM優(yōu)化:實(shí)戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對(duì)象、數(shù)組等,只要不斷地創(chuàng)建這些對(duì)象,并且保證 GC Roots 到對(duì)象之間有可達(dá)路徑來(lái)避免垃 圾收集回收機(jī)制清除這些對(duì)象,當(dāng)這些對(duì)象所占空間超過(guò)
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級(jí)

    來(lái)源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺(tái)Temu正對(duì)競(jìng)爭(zhēng)對(duì)手SHEIN提起新訴訟,訴狀稱(chēng)Shein&ldquo;利用市場(chǎng)支配力量強(qiáng)迫服裝廠(chǎng)商與之簽訂獨(dú)家
  • 自律,給不了Keep自由!

    來(lái)源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶(hù)自由暫時(shí)不好說(shuō),但大概率不能給Keep自由。近日,全球最大的在線(xiàn)健身平臺(tái)Keep正式登陸港交所,努力
  • 消息稱(chēng)小米汽車(chē)開(kāi)始篩選交付中心:需至少120個(gè)車(chē)位

    IT之家 7 月 7 日消息,日前,有微博簡(jiǎn)介為“汽車(chē)行業(yè)從業(yè)者、長(zhǎng)三角一體化擁護(hù)者”的微博用戶(hù) @長(zhǎng)三角行健者 發(fā)文表示,據(jù)經(jīng)銷(xiāo)商集團(tuán)反饋,小米汽車(chē)目前
  • 華為開(kāi)發(fā)者大會(huì)2023日程公開(kāi):開(kāi)設(shè)鴻蒙HarmonyOS 4體驗(yàn)區(qū)

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開(kāi)發(fā)者大會(huì) 2023 的詳細(xì)日程。整場(chǎng)大會(huì)將于 8 月 4 日-6 日之間舉行,屆時(shí)將發(fā)布最新一代鴻蒙 H
Top