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