暂无描述

race.js 2.4KB

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