今天在整理前段時間作過的項目,發現以前在集成web環信的時候遇到過一個奇怪的需求:
須要終止一個正在進行等待返回的promise,或者阻止其調用resolve和reject。(具體爲什麼會有這種需求我也不太記得了。。。javascript
如今回頭看,必定會有其餘的常規解決方案)。html
不過本着對未知牛角尖的專研精神(最近有點閒),在諮詢知乎大神,重讀阮大神的《es6入門》書中promise一章後,java
找到了一個原生js的解決方案:Promise.race。es6
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <button onclick="getInterface()">發送請求</button> <button id="cancel">取消調用接口</button> <script type="text/javascript"> //Promise.race([a,b])參數爲一個promise對象組成的數組, //此方法用來比較啊a和b哪個promise先返回,Promise.race結果就返回這個先返回的promise參數 function getInterface() { var promise1 = new Promise(function(resolve, reject) {
//模擬ajax異步請求 setTimeout(resolve, 3000, '接口返回成功!'); }); var promise2 = new Promise(function(resolve, reject) { document.querySelector('#cancel').addEventListener('click', function() { reject('取消等待接口!'); }); }); Promise.race([promise1, promise2]).then(function(value) { console.log(value); }).catch(function(value) { console.log(value); }); } </script> </body> </html>
上面的代碼點擊發送請求按鈕後,調用getIterface方法,web
方法內建立並當即執行兩個promise函數:promise1和promise2。Promise.race方法當即開始監聽這兩個promise對象的狀態。ajax
1. 若是3秒內用戶有任何操做,那麼promise1內的resolve方法被調用:此時「接口」返回成功,Promise.race再也不監聽promise2的狀態,數組
直接返回接口的返回結果:'接口返回成功!'。promise
2. 若是3秒內用戶點擊取消調用接口按鈕 ,那麼promise2內的reject方法被調用,此時Promise.race再也不監聽promise2(異步接口)的返回狀態,異步
直接返回promise2的返回結果:'取消等待接口'。函數
這樣就能夠模擬外部中斷promise返回結果了,好比 promise1是一個ajax請求,那麼就能夠在返回前在Promise.race中abort()請求了。