如何在外部終止一個pengding狀態的promise對象

今天在整理前段時間作過的項目,發現以前在集成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函數:promise1promise2Promise.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()請求了。

相關文章
相關標籤/搜索