6 `Promise.race` returns a new promise which is settled in the same way as the
7 first passed promise to settle.
12 let promise1 = new Promise(function(resolve, reject){
13 setTimeout(function(){
18 let promise2 = new Promise(function(resolve, reject){
19 setTimeout(function(){
24 Promise.race([promise1, promise2]).then(function(result){
25 // result === 'promise 2' because it was resolved before promise1
30 `Promise.race` is deterministic in that only the state of the first
31 settled promise matters. For example, even if other promises given to the
32 `promises` array argument are resolved, but the first settled promise has
33 become rejected before the other promises became fulfilled, the returned
34 promise will become rejected:
37 let promise1 = new Promise(function(resolve, reject){
38 setTimeout(function(){
43 let promise2 = new Promise(function(resolve, reject){
44 setTimeout(function(){
45 reject(new Error('promise 2'));
49 Promise.race([promise1, promise2]).then(function(result){
50 // Code here never runs
52 // reason.message === 'promise 2' because promise 2 became rejected before
53 // promise 1 became fulfilled
57 An example real-world use case is implementing timeouts:
60 Promise.race([ajax('foo.json'), timeout(5000)])
65 @param {Array} promises array of promises to observe
67 @return {Promise} a promise which settles in the same way as the first passed
70 export default function race(entries) {
71 /*jshint validthis:true */
72 let Constructor = this;
74 if (!isArray(entries)) {
75 return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
77 return new Constructor((resolve, reject) => {
78 let length = entries.length;
79 for (let i = 0; i < length; i++) {
80 Constructor.resolve(entries[i]).then(resolve, reject);