精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開(kāi)發(fā) 前端
有些人可能誤以為網(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ī)制”。

在討論前端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)被中斷,并在另一個(gè)時(shí)間點(diǎn)恢復(fù)。

什么是請(qǐng)求?

首先,讓我們介紹一下TCP/IP網(wǎng)絡(luò)模型。網(wǎng)絡(luò)模型從上到下分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。

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

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

理論上,應(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)的功能。

回答問(wèn)題

如果請(qǐng)求指的是網(wǎng)絡(luò)模型中的傳輸,那么自然是不可能暫停的。

考慮到使用場(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)是否可以暫停。

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

使用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)它。

如果我們使用 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。

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ù)。

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)。

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

最后

有些人可能誤以為網(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策略,以確保更好的可靠性。

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

責(zé)任編輯:姜華 來(lái)源: 大遷世界
相關(guān)推薦

2017-08-17 13:56:30

JavascriptNode.jsHttp

2020-05-20 09:26:59

Node.jsDenoJavaScript

2023-12-12 09:45:16

前端瀏覽器

2024-08-26 11:23:41

kitexcall

2019-07-23 10:20:23

前端Node.js中間層

2023-11-23 23:52:06

options請(qǐng)求瀏覽器

2023-04-10 15:14:03

2017-10-26 13:40:26

微信小程序Fly

2019-03-28 11:00:37

前端網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)

2018-11-19 16:10:30

瀏覽器urlhttp

2020-11-09 11:10:56

前端api緩存

2025-05-28 03:15:00

Scrapy數(shù)據(jù)sleep

2022-01-23 08:26:57

微信暫停語(yǔ)音朗讀文字

2019-11-01 10:00:14

前端業(yè)務(wù)代碼

2021-09-26 06:43:07

封裝網(wǎng)絡(luò)請(qǐng)求

2024-08-26 08:47:32

2015-08-07 10:06:26

加班編程熱情

2022-01-28 14:20:53

前端代碼中斷

2020-11-26 08:38:57

前端 js 庫(kù)vue

2022-01-21 19:00:44

前端JS框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲男人的天堂在线观看| 国产欧美高清| 91精品国产福利在线观看| 中文字幕一区二区三区四区五区人 | 欧美激情综合色| 五月婷婷综合在线观看| 中文成人在线| 欧美性色xo影院| 日本福利视频导航| 国产精品偷伦一区二区| 久久免费精品国产| 久久久久黄色| 精品欧美aⅴ在线网站| 亚洲欧洲日本国产| 香蕉久久一区二区三区| 久久成人久久爱| 欧美日本国产在线| 一级在线观看视频| 日韩在线你懂的| 51久久夜色精品国产麻豆| 黄色www网站| 国产激情视频在线观看| 91农村精品一区二区在线| 亚洲一区二区三区sesese| 无码人妻一区二区三区线| 亚洲网站啪啪| 欧美成人国产va精品日本一级| 亚洲天堂视频一区| 日韩美女国产精品| 欧美大胆一级视频| 手机免费看av网站| 性欧美freehd18| 精品久久久视频| 久久亚洲a v| 国产欧美黑人| 成人欧美一区二区三区小说 | 国产chinasex对白videos麻豆| 久久久噜噜噜久久狠狠50岁| 久久露脸国产精品| 日产精品久久久一区二区福利| 国产原创精品在线| 日本综合字幕| 欧美视频第一页| 免费毛片网站在线观看| 视频在线观看入口黄最新永久免费国产 | 久久五月精品| 中文字幕精品一区二区精品绿巨人| 久久66热这里只有精品| 日本毛片在线观看| 成人av免费网站| 国产精品免费一区二区三区四区| www.色亚洲| 国产精品88888| 亚洲一区二区三区xxx视频| 在线观看一二三区| 老司机一区二区| 国产在线高清精品| 国产同性人妖ts口直男| 国产精品一区二区在线观看不卡| 成人福利视频在线观看| 国产又爽又黄又嫩又猛又粗| 国产一区激情在线| av电影成人| 高清国产mv在线观看| 不卡免费追剧大全电视剧网站| 狠狠综合久久av| 青青国产在线| 国产精品久线在线观看| 欧美aaa在线观看| 亚洲小说区图片| 午夜精品福利久久久| av在线播放亚洲| 深夜成人福利| 欧美日韩不卡在线| xxxx国产视频| 日韩av系列| 中文字幕精品视频| 看免费黄色录像| 伊人蜜桃色噜噜激情综合| 欧美亚洲国产另类| 中文字字幕在线观看| 国产一区二区三区高清播放| 国产精品久久久久久免费观看| 手机看片福利在线观看| 国产精品美日韩| 青青草免费在线视频观看| 电影在线观看一区| 在线免费亚洲电影| 欧美诱惑福利视频| 99sesese| 日韩精品一区二区三区中文字幕| 亚洲国产另类久久精品| x88av在线| 欧美a级片网站| 茄子视频成人在线| 国产伦精品一区二区三区视频痴汉| 成人免费av资源| 日韩欧美亚洲区| 国产蜜臀av在线播放| 91福利在线导航| 一二三区视频在线观看| 欧美视频网址| 久久人人爽国产| 亚洲天堂狠狠干| 波多野结衣在线一区| 亚洲在线播放电影| 松下纱荣子在线观看| 91麻豆精品国产自产在线观看一区 | 国产三级av片| 国产呦萝稀缺另类资源| 欧美另类视频在线| 国产美女情趣调教h一区二区| 欧洲精品在线观看| 手机免费看av片| 国产韩日影视精品| 国产精品扒开腿爽爽爽视频| 亚洲精品无amm毛片| 国产精品麻豆一区二区| 18禁男女爽爽爽午夜网站免费| 精品三级久久久| 在线观看欧美www| 久久久久久久久久久久久av| 成人精品免费视频| 亚洲小说欧美另类激情| 欧美色片在线观看| 亚洲免费小视频| 日韩欧美三级视频| 丁香婷婷综合色啪| 日韩精品免费一区| 国产精品2区| 久久精品亚洲精品| 91麻豆成人精品国产| 国产欧美一二三区| 亚洲精品乱码久久久久久自慰| 大陆精大陆国产国语精品| 久久久成人精品视频| 日韩一区二区三区高清| 国产深喉视频一区二区| 国产精品国产三级国产| 久久久久国产一区| 日韩欧美视频专区| 国产精品专区h在线观看| 成人在线观看黄色| 欧美在线免费视屏| 69精品无码成人久久久久久| 日日夜夜精品免费视频| 欧美一区二区三区四区夜夜大片 | 国产精品扒开腿做| 青青草免费在线视频| 精品成人av一区| 精品视频站长推荐| 99精品福利视频| 国产亚洲欧美另类一区二区三区| 麻豆mv在线观看| 亚洲精品久久久一区二区三区 | 黄色片网站免费| 日韩精品欧美精品| 亚洲一区精品视频| 国产美女亚洲精品7777| 欧美高清在线播放| 女人18毛片水真多18精品| 午夜精品一区二区三区电影天堂| 第四色在线视频| 久久精品一区| 亚洲欧美日产图| 久久在线观看| 国模精品一区二区三区色天香| 神马久久久久久久久久| 91久久奴性调教| 在线观看美女av| 成人做爰69片免费看网站| 无码aⅴ精品一区二区三区浪潮 | 国产裸体舞一区二区三区| 美女毛片一区二区三区四区| 国产精品久久久久免费a∨大胸| 日韩毛片久久久| 日韩免费一区二区| 国产91精品一区| 国产精品美女www爽爽爽| 熟妇无码乱子成人精品| 玖玖爱在线观看| 综合久久精品| 久久亚洲综合网| 欧洲美女精品免费观看视频| 欧美极品美女视频网站在线观看免费| 少妇性bbb搡bbb爽爽爽欧美| 欧美日韩在线播放三区四区| 久久精品这里只有精品| 久久蜜桃av一区精品变态类天堂| 日本黄色的视频| 亚洲精品孕妇| 中文字幕一区二区三区最新 | 亚洲一区二区三区免费观看| 久久天堂久久| 国产精品96久久久久久又黄又硬| 成人福利片网站| 日韩电影免费观看在线观看| 91美女精品网站| 欧美日韩综合视频| 日韩一级片大全| 91老师片黄在线观看| 中文字幕在线观看日 | 欧美专区日韩视频| 成人日日夜夜| 亚洲一区二区久久| 欧日韩在线视频| 欧美疯狂做受xxxx富婆| 中文字幕第四页| 一区二区欧美国产| 中文字幕第69页| 久久这里只有精品视频网| 午夜诱惑痒痒网| 日韩av在线免费观看不卡| 东北少妇不带套对白| 小处雏高清一区二区三区| 欧洲精品久久| 香蕉久久99| 粉嫩av一区二区三区免费观看| 日本a人精品| 国产精品成人在线| 在线观看欧美日韩电影| 国语自产偷拍精品视频偷| 国产精品刘玥久久一区| 这里只有精品在线播放| 日本五码在线| 国产视频精品久久久| 囯产精品一品二区三区| 日韩欧美在线网站| 国产毛片在线视频| 欧美剧情电影在线观看完整版免费励志电影 | 中文字幕免费高清| 成人深夜福利app| www.桃色.com| 久久国产欧美日韩精品| 黑鬼大战白妞高潮喷白浆| 国产日韩1区| 久久亚洲中文字幕无码| 精品69视频一区二区三区Q| 日韩精品一区二区三区电影| 亚洲综合激情在线| 91手机视频在线| 亚洲成人一区| 五月天男人天堂| 亚洲国产精品日韩专区av有中文| 亚洲精品影院| 久久一区二区三区电影| 亚洲日本精品一区| 久久一区二区三区喷水| 宅男在线精品国产免费观看| 天天射综合网视频| 天天在线免费视频| 国产精品mm| www精品久久| 性8sex亚洲区入口| 久久久久久久久久久久久久国产| 久久久久久久欧美精品| 亚洲人成无码www久久久| 免费成人性网站| 中文字幕第22页| 国产99一区视频免费| 国产a级黄色片| 26uuu国产电影一区二区| 欧洲美一区二区三区亚洲| 欧美国产在线观看| 日本高清不卡免费| 亚洲国产视频一区| 草久久免费视频| 欧美亚洲国产怡红院影院| 中文字幕在线网站| 欧美mv和日韩mv的网站| 天天综合网在线| 中文字幕精品网| av在线网址观看| 97婷婷涩涩精品一区| 另类中文字幕国产精品| 91久久国产综合久久91精品网站| 视频一区日韩精品| 欧美日韩三区四区| 天天射天天综合网| 久久国产精品网| 日韩激情中文字幕| 无码国产精品一区二区高潮| 97精品国产露脸对白| 亚洲欧美综合7777色婷婷| 一个色综合网站| 蜜臀尤物一区二区三区直播| 91麻豆精品国产91久久久久久久久 | 国产精品888| 久久成人激情视频| 亚洲欧美国产毛片在线| 亚洲久久在线观看| 欧美高清精品3d| 欧美精品少妇| 欧美丰满少妇xxxxx| 中文另类视频| 国产精品手机在线| 欧美好骚综合网| 99爱视频在线| 国产精品一区二区不卡| 久久美女免费视频| 亚洲国产精品一区二区久久| 在线观看国产黄| 日韩精品免费观看| 手机av在线播放| 国产九九精品视频| 女人av一区| 欧美日韩不卡在线视频| 九九视频精品免费| 久久国产精品影院| 午夜欧美在线一二页| 国产理论视频在线观看| 国产午夜精品一区二区三区| 黄页网站在线观看免费| 国产欧美精品一区二区三区-老狼| 成人自拍在线| mm131午夜| 蜜臀av一区二区三区| 成人免费网站黄| 天天色综合天天| wwwxxxx国产| 久久中文字幕在线| 日日夜夜精品| 亚洲巨乳在线观看| 日韩精品91亚洲二区在线观看| 老熟妇精品一区二区三区| 一区二区在线观看免费视频播放| 亚洲无码久久久久久久| 国产一区二区成人| 欧美黑人粗大| 蜜桃av噜噜一区二区三| 中文亚洲欧美| 男男做爰猛烈叫床爽爽小说| 亚洲成a人v欧美综合天堂| 草草视频在线播放| 欧美成aaa人片在线观看蜜臀| 白嫩亚洲一区二区三区| 一区二区三区国产福利| 男女性色大片免费观看一区二区 | 亚洲人成伊人成综合网小说| 一区二区视频免费| 在线性视频日韩欧美| 国产精品原创视频| 亚洲一区在线免费| 精品一区二区三区在线观看 | 国产一区在线播放| 91九色精品国产一区二区| 在线观看岛国av| 中文字幕在线不卡| 99久久久无码国产精品免费| 欧美成人在线免费| 成人av资源网址| 国产一区二区网| 国产色一区二区| 伊人免费在线观看| yellow中文字幕久久| 国产精品一级在线观看| 国产欧美精品aaaaaa片| 成人不卡免费av| 久久久久女人精品毛片九一| 亚洲欧美日韩直播| 国产精品原创视频| 穿情趣内衣被c到高潮视频| 国产成人在线免费| 亚州国产精品视频| 亚洲欧美中文另类| 国产美女久久| 日本一本草久p| 成人黄色在线网站| 四虎成人在线观看| 日韩在线视频免费观看高清中文| 久久99成人| 国产精品333| 国产精品美女久久久久aⅴ| 精品国产18久久久久久| 91精品国产网站| 日韩在线看片| 美女搡bbb又爽又猛又黄www| 色综合久久99| 国产精品扒开做爽爽爽的视频| 国产一区国产精品| 日本最新不卡在线| 欧美日韩一级在线观看| 国产视频久久久| 91精品国产一区二区在线观看| 久操网在线观看| 国产精品色哟哟| 丰满大乳国产精品| 国产精品久久久久久久久男| 中文字幕一区二区三三| 香蕉视频黄色在线观看| 777午夜精品视频在线播放| 国产福利片在线观看| 一区二区三区三区在线| 99精品一区二区三区| 在线观看一二三区| 57pao成人永久免费视频| 9191国语精品高清在线| 91精彩刺激对白露脸偷拍| 欧美成人精品1314www| 成人激情视屏|