原文地址javascript
// `delay`毫秒後執行resolve function timerPromisefy(delay) { return new Promise(function (resolve) { setTimeout(function () { resolve(delay); }, delay); }); } // 任何一個promise變爲resolve或reject 的話程序就中止運行 Promise.race([ timerPromisefy(1), timerPromisefy(32), timerPromisefy(64), timerPromisefy(128) ]).then(function (value) { console.log(value); // => 1 });
Promise.race 是當接受的參數數組中有一個promise對象進入fulfilled或者rejected狀態的時候就中止運行。此時,因爲只有一個promise的狀態可以肯定,因此then執行的是惟一那個肯定狀態的resolve函數,而不會執行其餘的resolve,可是並不會阻止其餘promise的執行。java
咱們知道promise.race若是參數promise數組中只要有一個promise狀態改變就會執行後續的回調,那麼若是參數數組中最早返回的是失敗狀態,那就直接走到了rejected,其實這違背了咱們使用的初衷。不過參數中promise狀態的改變是由開發者控制的,若是不想發生這樣的狀況,能夠在promise定義的時候設置好錯誤處理,保證promise.race須要解析的必定是肯定的狀態。git
在實際應用中,promise.race經常使用來設置超時操做,好比接口請求超時等。並且要注意不要給promise.race傳入空數組,那麼這個promise將不會被解析。github
若是沒有建立新的promise,每次都是返回以前的promise,那麼當最開始promise的狀態發生改變以後,後續的promise狀態其實已經固定不會再改變了。這就沒法實現promise的功能,因此每次的promise對象都應該相互獨立,互相不影響。數組
let promise1 = Promise.resolve() let promise2 = promise1.then(function foo(value) { return Promise.reject(3) })
執行結果:promise
看似矛盾,promise1明明執行了成功的回調,爲何最後promise2的狀態是rejected。緣由是在調用then的時候,建立了新的promise,此時與promise1已經沒有關係了,返回的時候改變的是新建立的promise的狀態,變爲rejected。函數
不過看了下Promises/A+的標準,這邊敘述貌似還有些須要再研究確認一下的地方。spa
標準中說,若是onFulfilled或者onRejected返回一個promise對象(thenable對象),那麼promise2會接受x的狀態。上述代碼彷佛執行結果與標準中的敘述有矛盾,這個問題還須要再思考下。code
這個其實並非矛盾,promise2接受的是返回的promise的狀態,與原來的沒有關係。這邊確實很容易混淆。對象
promise1.then(function func(value){ console.log('1-'+value) return value * 2 }).then(function func(value){ console.log('2-'+value); }).then(function func(value){ console.log('3-'+value) })
執行結果
能夠看到,若是不使用沒有return,那麼上一個then的執行結果並不會傳遞到下一個then當中。
有些問題若是以爲有疑惑或者弄不太清,那就必定要想着寫個demo運行看下,不能靠直覺或者思惟定勢去想結果,畢竟~實踐是檢驗真理的惟一標準~