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

JavaScript取消Promise操作的常見實現方式

 更新時間:2025年10月22日 08:36:09   作者:東東233  
在 JavaScript 中,Promise 本身沒有內置的取消機制,但我們可以通過一些模式來實現類似取消的功能,以下是幾種常見的實現方式,需要的朋友可以參考下

前言

在 JavaScript 中,Promise 本身沒有內置的取消機制,但我們可以通過一些模式來實現類似取消的功能。以下是幾種常見的實現方式

方法一:使用 Promise.race() 模擬取消

Promise.race 靜態(tài)方法接受一個 promise 可迭代對象作為輸入,并返回一個 Promise。這個返回的 promise 會隨著第一個 promise 的敲定而敲定。 那么我們可以傳給它兩個Promise,一個正常執(zhí)行,一個我們將Promise的reject方法緩存下來,只需要在我們需要取消的時候調用即可

// 封裝取消函數
const cancelPromise = (promise) => {
  let cancel
  // 定義一個取消的Promise
  const rejectPromise = new Promise((_, reject) => {
    cancel = () => {
      reject({ name: 'cancel' })
    }
  })
  const resultPromise = Promise.race([promise, rejectPromise])
  return {
    cancel,
    promise: resultPromise
  }
}
const { cancel, promise } = cancelPromise(
  new Promise((resolve) => {
    // 3s之后完成
    setTimeout(() => {
      resolve({ data: [] })
    }, 3000)
  })
)
promise
  .then((res) => {
    console.log('Promise Resolve', res)
  })
  .catch((error) => {
    // 'cancel'
    console.log(error.name)
  })
setTimeout(() => {
  cancel()
}, 2000)

方法二:使用 AbortController(推薦)

AbortController 是一個構造函數,其signal我們可以傳給fetch Api,然后我們只需要調用abort方法就可以取消該請求axios也支持該方法取消。

const controller = new AbortController()
fetch('http://api.com/query', { signal: controller.signal })
  .then((res) => {
    console.log(res)
  })
  .catch((error) => {
    if (error.name === 'AbortError') {
      console.log('Promise 已取消')
    }
  })
// 超時取消
setTimeout(() => {
  controller.abort()
}, 2000)

被取消的請求會被瀏覽器標記為canceled

方法三:使用 Bluebird 庫

Bluebird 是一個完善的Promise庫,其完全遵循Promises/A+標準,所以我們可以像日常使用Promise一樣使用他,而且它有許多超越原生Promise的功能、比如支持 Promise 取消、進度追蹤、超時控制、更強大的錯誤處理機制(如 OperationalError)等。我們使用時候只需要安裝后直接引入即可

yarn add bluebird
import Promise from 'bluebird'
...
// 打開取消功能
Promise.config({ cancellation: true })
const testPromise  = new Promise((resolve, reject, onCancel) => {
  setTimeout(() => {
    resolve('成功')
  }, 3000)
  onCancel(function () {
    console.log('promise 已被取消')
  })
})
  .then((res) => {
    console.log(res)
  }).finally(() => {
    // 判斷Promise是否取消
    if(testPromise.isCancelled()) {
      console.log('promise 已被取消')
    }
  })
setTimeout(() => {
  // 取消Promise
  testPromise.cancel()
}, 1000)

可以看到正常使用和原生Promise并無區(qū)別,但是新增了onCancel、cancel、config等Api,簡單介紹下

  • cancel:用于取消當前Promise
  • onCancel:Promise取消后會調用傳入該方法的回調
  • isCancelled:判斷Promise是否取消
  • config:配置項,因為取消Promise在當前版本中是默認關閉、傳入cancellation: true打開取消功能

總結與對比

在前端開發(fā)中,取消 Promise 操作是處理異步流程控制的重要能力。以下是各方案的對比:

方案對比

方案優(yōu)點缺點適用場景
Promise.race()純 JavaScript 實現,無需額外庫只是"模擬"取消,實際異步操作仍在執(zhí)行簡單的取消需求,兼容性要求高
AbortController原生支持,與 fetch API 深度集成較新的 API,需要 polyfill網絡請求取消,現代瀏覽器項目
Bluebird功能豐富,API 完善需要引入第三方庫,增加包體積需要高級 Promise 功能的復雜應用

實踐建議

  1. 現代項目首選 AbortController - 隨著原生支持的普及,這是最標準和推薦的方式
  2. 簡單場景用 Promise.race() - 對于簡單的取消需求,這種方式足夠且輕量
  3. 復雜異步流程考慮 Bluebird - 如果需要進度追蹤、超時控制等高級功能

注意事項

  • 取消 Promise 并不意味著底層操作真的停止了(如定時器)
  • 要及時清理資源,避免內存泄漏
  • 在 React/Vue 等框架中,組件卸載時務必取消未完成的異步操作

選擇合適的方法取決于具體需求、瀏覽器兼容性要求和項目架構。

以上就是JavaScript取消Promise操作的常見實現方式的詳細內容,更多關于JavaScript取消Promise操作的資料請關注腳本之家其它相關文章!

相關文章

  • 微信小程序非swiper組件實現的自定義偽3D輪播圖效果示例

    微信小程序非swiper組件實現的自定義偽3D輪播圖效果示例

    這篇文章主要介紹了微信小程序非swiper組件實現的自定義偽3D輪播圖效果,涉及微信小程序事件響應及元素屬性動態(tài)操作實現輪播圖效果相關技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • 使用JavaScript實現網頁版Pongo設計思路及源代碼分享

    使用JavaScript實現網頁版Pongo設計思路及源代碼分享

    Pongo是款很好玩的手欠類游戲,由于在玩的過程中發(fā)現了一些BUG,所以就打算自己也弄個,經過一番思索,就有了本文,主要說說實現這款游戲的設計思路以及分享源碼給大家
    2014-06-06
  • js拖動div 當鼠標移動時整個div也相應的移動

    js拖動div 當鼠標移動時整個div也相應的移動

    要拖動的div為最外層的div,這段代碼對顯示對話框的頭部綁定鼠標監(jiān)聽事件,當鼠標移動時,整個div也相應的移動,具體的實現如下,感興趣的朋友可以參考下
    2013-11-11
  • js實現圖片跟隨鼠標移動效果

    js實現圖片跟隨鼠標移動效果

    這篇文章主要為大家詳細介紹了js實現圖片跟隨鼠標移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 淺談js閉包理解

    淺談js閉包理解

    這篇文章主要介紹了對js閉包理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • js實現旋轉的星空效果

    js實現旋轉的星空效果

    這篇文章主要為大家詳細介紹了js實現旋轉的星空效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 面向JavaScript入門初學者的二叉搜索樹算法教程

    面向JavaScript入門初學者的二叉搜索樹算法教程

    二叉搜索樹則是二叉樹的一種,但它只允許你在左側節(jié)點儲存比父節(jié)點小的值,右側只允許儲存比父節(jié)點大的值,這篇文章主要給大家介紹了關于JavaScript二叉搜索樹算法的相關資料,需要的朋友可以參考下
    2021-09-09
  • JS獲取當前時間實例代碼(年月日時分秒)

    JS獲取當前時間實例代碼(年月日時分秒)

    在javascript中,可以使用Date對象中的Date()方法來獲取當前時間,下面這篇文章主要給大家介紹了關于JS獲取當前時間(年月日時分秒)的相關資料,需要的朋友可以參考下
    2022-09-09
  • document.compatMode的CSS1compat使用介紹

    document.compatMode的CSS1compat使用介紹

    這篇文章主要介紹了document.compatMode的CSS1compat使用,需要的朋友可以參考下
    2014-04-04
  • 一文詳解如何在瀏覽器中使用JavaScript

    一文詳解如何在瀏覽器中使用JavaScript

    這篇文章主要介紹了在瀏覽器中使用JavaScript的步驟,包括啟用JavaScript、編寫和運行JavaScript代碼的方法,以及一些注意事項,需要的朋友可以參考下
    2025-03-03

最新評論

菏泽市| 临泽县| 闵行区| 通道| 姜堰市| 开江县| 和田县| 博客| 唐山市| 青铜峡市| 林州市| 临邑县| 合川市| 红安县| 盱眙县| 顺昌县| 托里县| 隆昌县| 江阴市| 永靖县| 韶山市| 阿拉善右旗| 灵山县| 临颍县| 白山市| 北辰区| 平塘县| 石门县| 河北省| 普安县| 张家口市| 郁南县| 虎林市| 潼南县| 成安县| 思南县| 陕西省| 安义县| 犍为县| 佛坪县| 屯留县|