當前位置: 妍妍網 > 碼農

如何【中止】一個 Promise 呢?一個有意思的問題~

2024-05-19碼農

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~

前言

最近看到一道大廠的面試題,我覺得這道題不錯,能考驗到大家的 Promise 基礎。題目如下~

看到這道題你們會怎麽去回答呢?就比如有以下的一個 Promise ,我們要如何去中止他呢?

用變量去中斷?

很多人會第一時間想到,使用一個變量去控制要不要中止這個 Promise

但是你們覺得這樣是對的嗎?其實這樣並不是真正的中止,因為我們只是限制了 resolve 的執行,但是 setTimeout 還是走完了,所以輸出了 請求到數據

而真正的中止,肯定是把 setTimeout 也中止掉,所以需要改改

但是可以看到,新增一個標識變量,非常的繁瑣,況且如果有多個 Promise,那就得要有多個標識變量,非常麻煩,所以換一種方式

Promise.race?

我們在工作中都會使用到 Promise.race 這個方法去判斷一個請求有沒有超時,那同理,可不可以用 Promise.race 來進行中止 Promise 的操作呢?

可以看到,這個中止也不是真的中止,也只是限制了 resolve 的執行,而不是把 setTimeout 也給中斷了~

CancelToken

接下來是紅寶書上的做法,堪稱經典,不用使用任何全域的標識變量,也能做到中止 Promise

這種做法的好處是:

  • 1、不需要設定全域的標識變量

  • 2、多個請求並行也可以區別取消

  • 比如我多次執行的話,想取消哪次就取消哪次,因為每次的 CancelToken 例項都是新的!!!

    結語

    我是林三心

  • 一個待過 小型toG型外包公司、大型外包公司、小公司、潛力型創業公司、大公司 的作死型前端選手;

  • 一個偏前端的全幹工程師;

  • 一個不正經的金塊作者;

  • 逗比的B站up主;

  • 不帥的小紅書博主;

  • 喜歡打鐵的籃球菜鳥;

  • 喜歡歷史的乏味少年;

  • 喜歡rap的五音不全弱雞如果你想一起學習前端,一起摸魚,一起研究簡歷最佳化,一起研究面試進步,一起交流歷史音樂籃球rap,可以來俺的摸魚學習群哈哈,點這個,有7000多名前端小夥伴在等著一起學習哦 -->