成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何取消一個(gè)已經(jīng)開始的 JavaScript Promise

開發(fā) 前端
雖然 Promise 本身的核心設(shè)計(jì)使其不可變,但通過 AbortController 這一強(qiáng)大的模式,我們已經(jīng)可以非常有效地控制和終止異步流程,編寫出更健壯、更高效的應(yīng)用程序。?

在現(xiàn)代前端開發(fā)中,Promise 和 async/await 已經(jīng)成為處理異步操作的基石。然而,一個(gè)常見的棘手問題是:如何取消一個(gè)已經(jīng)開始的 Promise?

比如,用戶發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求,但在請(qǐng)求完成前又導(dǎo)航到了其他頁面;或者用戶在一個(gè)搜索框中快速輸入,我們需要取消前一次的搜索請(qǐng)求,只保留最后一次。在這些場(chǎng)景下,取消一個(gè)進(jìn)行中的 Promise 就顯得至關(guān)重要。

核心問題:為什么 Promise 本身不可取消?

首先,我們需要理解 Promise 的核心設(shè)計(jì)理念。一個(gè) Promise 代表一個(gè)異步操作的最終結(jié)果。它的狀態(tài)一旦從 pending(進(jìn)行中)變?yōu)?nbsp;fulfilled(已成功)或 rejected(已失敗),就永遠(yuǎn)不會(huì)再改變。

Promise 本身不提供取消機(jī)制,原因如下:

  • 狀態(tài)不可逆:這是 Promise 的核心規(guī)范。一旦狀態(tài)改變,就形成了一個(gè)確定的、不可變的結(jié)果。
  • 單一責(zé)任:Promise 的職責(zé)是傳遞價(jià)值和狀態(tài),而不是控制異步操作本身的執(zhí)行流程。發(fā)起異步操作的函數(shù)(如 fetch)才是執(zhí)行者。

打個(gè)比方:你寄出了一封信(發(fā)起了一個(gè) Promise),你不能在信件投遞過程中把它神奇地從郵政系統(tǒng)里撤回來。你能做的,是在信件送達(dá)時(shí)(Promise 完成時(shí)),選擇忽略它。

我們的目標(biāo),就是實(shí)現(xiàn)這種“忽略”機(jī)制,并盡可能地通知底層的異步操作停止工作,以節(jié)省資源。

AbortController

AbortController 是目前實(shí)現(xiàn) Promise 取消的最佳實(shí)踐和標(biāo)準(zhǔn)方案。它最初是為取消 fetch 請(qǐng)求而設(shè)計(jì)的,但其通用性使其可以與任何異步操作集成。

AbortController 的工作方式:

  • 創(chuàng)建一個(gè) AbortController 實(shí)例。
  • controller.signal:這是一個(gè) AbortSignal 對(duì)象,可以傳遞給需要支持取消的異步函數(shù)(如 fetch)。
  • controller.abort():調(diào)用此方法來發(fā)出“中止”信號(hào)。
  • 當(dāng) abort() 被調(diào)用時(shí),signal 會(huì)通知所有監(jiān)聽它的異步操作。對(duì)于 fetch 來說,它會(huì)自動(dòng)中止網(wǎng)絡(luò)請(qǐng)求并讓 Promise reject 一個(gè)名為 AbortError 的錯(cuò)誤。

(1) 與 fetch 配合使用

這是 AbortController 最常見的用法。

在 async/await 語法中同樣清晰:

(2) 在自定義 Promise 中使用 AbortController

你也可以讓你自己的異步函數(shù)支持 AbortSignal。

原理:

  • 你的函數(shù)需要接收 signal 作為參數(shù)。
  • 在異步操作的關(guān)鍵節(jié)點(diǎn),檢查 signal.aborted 屬性。如果為 true,則提前退出。
  • 使用 signal.addEventListener('abort', ...) 來注冊(cè)清理邏輯(如清除定時(shí)器)。

優(yōu)點(diǎn):

  • 官方標(biāo)準(zhǔn):是 W3C 和 WHATWG 定義的標(biāo)準(zhǔn) API。
  • 真正中止底層操作:fetch 會(huì)中止網(wǎng)絡(luò)連接,自定義函數(shù)也可以通過它來清理資源(如清除定時(shí)器),避免了不必要的浪費(fèi)。
  • 語義清晰:通過專門的 AbortError 來區(qū)分“取消”和“其他錯(cuò)誤”,代碼更健壯。
  • 組合性強(qiáng):一個(gè) AbortSignal 可以傳遞給多個(gè) Promise,實(shí)現(xiàn)批量取消。

雖然 Promise 本身的核心設(shè)計(jì)使其不可變,但通過 AbortController 這一強(qiáng)大的模式,我們已經(jīng)可以非常有效地控制和終止異步流程,編寫出更健壯、更高效的應(yīng)用程序。

責(zé)任編輯:趙寧寧 來源: JavaScript
相關(guān)推薦

2024-05-20 01:10:00

Promise變量

2021-04-28 08:21:21

Promise.any服務(wù)器場(chǎng)景

2021-04-27 08:31:37

Promisereject信息

2014-10-21 10:25:50

程序員

2016-09-26 17:26:20

2020-09-24 11:46:03

Promise

2015-03-10 11:21:44

JavaScript組JavaScript

2020-09-02 07:22:17

JavaScript插件框架

2018-07-03 15:20:36

Promise函數(shù)借錢

2018-11-09 10:50:24

JavaScript前端

2015-06-25 09:32:55

JavaScript程序員

2024-04-11 08:30:05

JavaScript數(shù)組函數(shù)

2023-09-15 15:31:23

異步編程Promise

2015-06-25 19:23:03

JavaScript程序員

2015-06-25 09:53:13

JavaScript程序員

2015-07-23 11:59:27

JavascriptPromise

2017-03-15 08:43:29

JavaScript模板引擎

2017-03-20 17:59:19

JavaScript模板引擎

2018-11-08 16:18:07

JavaScript前端

2012-06-04 18:02:56

社區(qū)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 密乳av | 欧美色综合 | 欧美二区在线 | 国产精品免费视频一区 | 久久久久久色 | 欧美精品一区在线 | 日日日操 | 国产在线观看一区二区三区 | 一区二区三区亚洲 | 九九热这里 | 欧美黄色免费网站 | 欧美午夜影院 | 在线免费观看成年人视频 | 国产午夜精品久久 | 午夜精品一区二区三区在线播放 | 国产一区二区三区视频 | av在线亚洲天堂 | 午夜视频网站 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 狠狠爱综合网 | 一区二区精品 | 欧美aⅴ在线观看 | 亚洲国产一区在线 | 免费视频一区二区 | 777zyz色资源站在线观看 | 欧美人人 | 黄色免费观看 | 久久精品久久久 | 日韩在线日韩 | 91亚洲精品国偷拍自产在线观看 | 四色成人av永久网址 | 成人免费一区二区三区视频网站 | 日韩精品视频在线观看一区二区三区 | 国产高清视频 | 精品久久久久久久久久久 | 天堂一区在线观看 | 免费看片国产 | 日韩三级 | 在线 丝袜 欧美 日韩 制服 | 免费h在线 | 久久久久久美女 |