race.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {
  2. isArray
  3. } from "../utils";
  4. /**
  5. `Promise.race` returns a new promise which is settled in the same way as the
  6. first passed promise to settle.
  7. Example:
  8. ```javascript
  9. let promise1 = new Promise(function(resolve, reject){
  10. setTimeout(function(){
  11. resolve('promise 1');
  12. }, 200);
  13. });
  14. let promise2 = new Promise(function(resolve, reject){
  15. setTimeout(function(){
  16. resolve('promise 2');
  17. }, 100);
  18. });
  19. Promise.race([promise1, promise2]).then(function(result){
  20. // result === 'promise 2' because it was resolved before promise1
  21. // was resolved.
  22. });
  23. ```
  24. `Promise.race` is deterministic in that only the state of the first
  25. settled promise matters. For example, even if other promises given to the
  26. `promises` array argument are resolved, but the first settled promise has
  27. become rejected before the other promises became fulfilled, the returned
  28. promise will become rejected:
  29. ```javascript
  30. let promise1 = new Promise(function(resolve, reject){
  31. setTimeout(function(){
  32. resolve('promise 1');
  33. }, 200);
  34. });
  35. let promise2 = new Promise(function(resolve, reject){
  36. setTimeout(function(){
  37. reject(new Error('promise 2'));
  38. }, 100);
  39. });
  40. Promise.race([promise1, promise2]).then(function(result){
  41. // Code here never runs
  42. }, function(reason){
  43. // reason.message === 'promise 2' because promise 2 became rejected before
  44. // promise 1 became fulfilled
  45. });
  46. ```
  47. An example real-world use case is implementing timeouts:
  48. ```javascript
  49. Promise.race([ajax('foo.json'), timeout(5000)])
  50. ```
  51. @method race
  52. @static
  53. @param {Array} promises array of promises to observe
  54. Useful for tooling.
  55. @return {Promise} a promise which settles in the same way as the first passed
  56. promise to settle.
  57. */
  58. export default function race(entries) {
  59. /*jshint validthis:true */
  60. let Constructor = this;
  61. if (!isArray(entries)) {
  62. return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
  63. } else {
  64. return new Constructor((resolve, reject) => {
  65. let length = entries.length;
  66. for (let i = 0; i < length; i++) {
  67. Constructor.resolve(entries[i]).then(resolve, reject);
  68. }
  69. });
  70. }
  71. }