作者:安静

    1. function isPromise(value) {
    2. if (
    3. typeof value === "function" ||
    4. (typeof value === "object" && value !== null)
    5. ) {
    6. if (typeof value.then === "function") {
    7. return true;
    8. }
    9. }
    10. return false;
    11. }
    12. Promise.myRace1 = (values) => {
    13. return new Promise((resolve, reject) => {
    14. for (let i = 0; i < values.length; i++) {
    15. const current = values[i];
    16. if (isPromise(current)) {
    17. current.then(resolve, reject); //一旦成功就直接停止
    18. } else {
    19. resolve(current);
    20. }
    21. }
    22. });
    23. };

    作者:
    作者:gochri

    1. /**
    2. * @param {Array/Map/Set[Promise]} promiseList
    3. * @return {Promise}
    4. */
    5. const promiseRace = (promiseList = []) => {
    6. return new Promise((resolve, reject) => {
    7. // [] 时永远等待
    8. // if (promiseList.length === 0) { resolve() }
    9. for (let i in promiseList) {
    10. let promise = promiseList[i];
    11. Promise.resolve(promise)
    12. .then((res) => {
    13. // return first resolve
    14. resolve(res);
    15. })
    16. .catch((rej) => {
    17. // return first reject
    18. reject(rej);
    19. });
    20. }
    21. });
    22. };
    23. // ------- Test Case -------
    24. let promise = Promise.resolve(1);
    25. let promise1, promise2, promise3;
    26. // Case 1
    27. promise = promiseRace([]);
    28. // promise
    29. // .then((values) => {
    30. // console.log("values", values);
    31. // })
    32. // .catch((error) => {
    33. // console.log("error", error);
    34. // });
    35. // values undefined
    36. // Case 5:default case
    37. // promise1 = new Promise((resolve, reject) => {
    38. // setTimeout(resolve, 500, 'one');
    39. // });
    40. // promise2 = new Promise((resolve, reject) => {
    41. // setTimeout(resolve, 100, 'two');
    42. // });
    43. // promiseRace([promise1, promise2]).then((value) => {
    44. // console.log(value);
    45. // // Both resolve, but promise2 is faster
    46. // });
    47. // expected output: "two"
    48. // Case 6: 异步性
    49. // var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];
    50. // var p = promiseRace(resolvedPromisesArray);
    51. // // immediately logging the value of p
    52. // console.log(p);
    53. // // using setTimeout we can execute code after the stack is empty
    54. // setTimeout(function () {
    55. // console.log('the stack is now empty');
    56. // console.log(p);
    57. // });
    58. // Promise { <pending> }
    59. // {/* the stack is now empty */ }
    60. // {/* Promise { 33 } */ }
    61. // Case7: setTimeout
    62. var p1 = new Promise(function (resolve, reject) {
    63. setTimeout(resolve, 500, "one");
    64. });
    65. var p2 = new Promise(function (resolve, reject) {
    66. setTimeout(resolve, 100, "two");
    67. });
    68. promiseRace([p1, p2]).then(function (value) {
    69. console.log(value); // "two"
    70. // 两个都完成,但 p2 更快
    71. });
    72. var p3 = new Promise(function (resolve, reject) {
    73. setTimeout(resolve, 100, "three");
    74. });
    75. var p4 = new Promise(function (resolve, reject) {
    76. setTimeout(reject, 500, "four");
    77. });
    78. promiseRace([p3, p4]).then(function (value) {
    79. console.log(value); // "three"
    80. // p3 更快,所以它完成了
    81. }, function (reason) {
    82. // 未被调用
    83. });
    84. var p5 = new Promise(function (resolve, reject) {
    85. setTimeout(resolve, 500, "five");
    86. });
    87. var p6 = new Promise(function (resolve, reject) {
    88. setTimeout(reject, 100, "six");
    89. });
    90. promiseRace([p5, p6]).then(function (value) {
    91. // 未被调用
    92. }, function (reason) {
    93. console.log(reason); // "six"
    94. // p6 更快,所以它失败了
    95. });
    96. // two
    97. // three
    98. // six

    作者:奥兰度

    1. Promise.myRace = (promiseList) => {
    2. return new Promise((resolve, reject) => {
    3. promiseList.forEach(promise => {
    4. promise.then(val => {
    5. resolve(val)
    6. }).catch(err => {
    7. reject(err)
    8. })
    9. })
    10. })
    11. }