如何中止一個 Promise 呢?一個有意思的問題
前言
最近看到一道大廠的面試題,我覺得這道題不錯,能考驗到大家的 Promise 基礎。題目如下~
看到這道題你們會怎么去回答呢?就比如有以下的一個 Promise ,我們要如何去中止他呢?
用變量去中斷?
很多人會第一時間想到,使用一個變量去控制要不要中止這個 Promise:
但是你們覺得這樣是對的嗎?其實這樣并不是真正的中止,因為我們只是限制了 resolve 的執(zhí)行,但是 setTimeout 還是走完了,所以輸出了 請求到數(shù)據(jù):
而真正的中止,肯定是把 setTimeout 也中止掉,所以需要改改:
但是可以看到,新增一個標識變量,非常的繁瑣,況且如果有多個 Promise,那就得要有多個標識變量,非常麻煩,所以換一種方式。
Promise.race?
我們在工作中都會使用到 Promise.race這個方法去判斷一個請求有沒有超時,那同理,可不可以用 Promise.race 來進行中止 Promise 的操作呢?
可以看到,這個中止也不是真的中止,也只是限制了 resolve 的執(zhí)行,而不是把 setTimeout 也給中斷了~
CancelToken
接下來是紅寶書上的做法,堪稱經(jīng)典,不用使用任何全局的標識變量,也能做到中止 Promise:
這種做法的好處是:
- 不需要設置全局的標識變量
- 多個請求并發(fā)也可以區(qū)別取消
比如我多次執(zhí)行的話,想取消哪次就取消哪次,因為每次的 CancelToken實例都是新的!??!