接著我們來看看和?[`Promise.all`](http://liubin.github.io/promises-book/#Promise.all)?類似的對多個promise對象進行處理的?[`Promise.race`](http://liubin.github.io/promises-book/#Promise.race)?方法。
它的使用方法和Promise.all一樣,接收一個promise對象數組為參數。
`Promise.all`?在接收到的所有的對象promise都變為 FulFilled 或者 Rejected 狀態之后才會繼續進行后面的處理, 與之相對的是?`Promise.race`?只要有一個promise對象進入 FulFilled 或者 Rejected 狀態的話,就會繼續進行后面的處理。
像Promise.all時的例子一樣,我們來看一個帶計時器的?`Promise.race`?的使用例子。
promise-race-timer.js
~~~
// `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
});
~~~
上面的代碼創建了4個promise對象,這些promise對象會分別在1ms,32ms,64ms和128ms后變為確定狀態,即FulFilled,并且在第一個變為確定狀態的1ms后,?`.then`?注冊的回調函數就會被調用,這時候確定狀態的promise對象會調用?`resolve(1)`?因此傳遞給?`value`?的值也是1,控制臺上會打印出`1`來。
下面我們再來看看在第一個promise對象變為確定(FulFilled)狀態后,它之后的promise對象是否還在繼續運行。
promise-race-other.js
~~~
var winnerPromise = new Promise(function (resolve) {
setTimeout(function () {
console.log('this is winner');
resolve('this is winner');
}, 4);
});
var loserPromise = new Promise(function (resolve) {
setTimeout(function () {
console.log('this is loser');
resolve('this is loser');
}, 1000);
});
// 第一個promise變為resolve后程序停止
Promise.race([winnerPromise, loserPromise]).then(function (value) {
console.log(value); // => 'this is winner'
});
~~~
我們在前面代碼的基礎上增加了?`console.log`?用來輸出調試信息。
執行上面代碼的話,我們會看到 winnter和loser promise對象的?`setTimeout`?方法都會執行完畢,?`console.log`?也會分別輸出它們的信息。
也就是說,?[`Promise.race`](http://liubin.github.io/promises-book/#Promise.race)?在第一個promise對象變為Fulfilled之后,并不會取消其他promise對象的執行。
> 在?[ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)?規范中,也沒有取消(中斷)promise對象執行的概念,我們必須要確保promise最終進入resolve or reject狀態之一。也就是說Promise并不適用于?[狀態](http://liubin.github.io/promises-book/#promise-states)?可能會固定不變的處理。也有一些類庫提供了對promise進行取消的操作。
- 前言
- 第一章 - 什么是Promise
- 1.1. 什么是Promise
- 1.2. Promise簡介
- 1.3. 編寫Promise代碼
- 第二章 - 實戰Promise
- 2.1. Promise.resolve
- 2.2. Promise.reject
- 2.3. 專欄: Promise只能進行異步操作?
- 2.4. Promise#then
- 2.5. Promise#catch
- 2.6. 專欄: 每次調用then都會返回一個新創建的promise對象
- 2.7. Promise和數組
- 2.8. Promise.all
- 2.9. Promise.race
- 2.10. then or catch?
- 第三章 - Promise測試
- 3.1. 基本測試
- 3.2. Mocha對Promise的支持
- 3.3. 編寫可控測試(controllable tests)
- 第四章 - Advanced
- 4.1. Promise的實現類庫(Library)
- 4.2. Promise.resolve和Thenable
- 4.3. 使用reject而不是throw
- 4.4. Deferred和Promise
- 4.5. 使用Promise.race和delay取消XHR請求
- 4.6. 什么是 Promise.prototype.done ?
- 4.7. Promise和方法鏈(method chain)
- 4.8. 使用Promise進行順序(sequence)處理
- 第五章 - Promises API Reference
- 5.1. Promise#then
- 5.2. Promise#catch
- 5.3. Promise.resolve
- 5.4. Promise.reject
- 5.5. Promise.all
- 5.6. Promise.race
- 第六章 - 用語集
- 第七章 - 參考網站
- 第八章 - 關于作者
- 第九章 - 關于譯者