| 3 | 3 | // convenience to get you started writing code faster. |
| 4 | 4 | // |
| 5 | 5 | |
| 6 | | export const promisify = () => { |
| 7 | | throw new Error('Remove this line and implement the function'); |
| 6 | export const promisify = (fn) => { |
| 7 | // Edge Case: Non-function input to promisify |
| 8 | if (typeof fn !== 'function') { |
| 9 | throw new TypeError('Expected a function'); |
| 10 | } |
| 11 | |
| 12 | return (...args) => { |
| 13 | return new Promise((resolve, reject) => { |
| 14 | fn(...args, (error, data) => { |
| 15 | if (error) { |
| 16 | reject(error); |
| 17 | } else { |
| 18 | resolve(data); |
| 19 | } |
| 20 | }); |
| 21 | }); |
| 22 | }; |
| 23 | // Handled Edge Cases: Non-function input to promisify |
| 8 | 24 | }; |
| 9 | 25 | |
| 10 | | export const all = () => { |
| 11 | | throw new Error('Remove this line and implement the function'); |
| 26 | export const all = (promises) => { |
| 27 | // Edge Case: No arguments provided |
| 28 | if (promises === undefined) { |
| 29 | return Promise.resolve(undefined); |
| 30 | } |
| 31 | |
| 32 | // Edge Case: Empty array of promises |
| 33 | if (!Array.isArray(promises) || promises.length === 0) { |
| 34 | return Promise.resolve([]); |
| 35 | } |
| 36 | |
| 37 | return new Promise((resolve, reject) => { |
| 38 | const results = []; |
| 39 | let completed = 0; |
| 40 | |
| 41 | promises.forEach((promise, index) => { |
| 42 | Promise.resolve(promise) |
| 43 | .then((value) => { |
| 44 | results[index] = value; |
| 45 | completed++; |
| 46 | |
| 47 | if (completed === promises.length) { |
| 48 | resolve(results); |
| 49 | } |
| 50 | }) |
| 51 | .catch((error) => { |
| 52 | // Edge Case: Rejected promises in all() method |
| 53 | reject(error); |
| 54 | }); |
| 55 | }); |
| 56 | }); |
| 57 | // Handled Edge Cases: Empty array of promises, Rejected promises in all() method |
| 12 | 58 | }; |
| 13 | 59 | |
| 14 | | export const allSettled = () => { |
| 15 | | throw new Error('Remove this line and implement the function'); |
| 60 | export const allSettled = (promises) => { |
| 61 | // Edge Case: No arguments provided |
| 62 | if (promises === undefined) { |
| 63 | return Promise.resolve(undefined); |
| 64 | } |
| 65 | |
| 66 | // Edge Case: Empty array of promises |
| 67 | if (!Array.isArray(promises) || promises.length === 0) { |
| 68 | return Promise.resolve([]); |
| 69 | } |
| 70 | |
| 71 | return new Promise((resolve) => { |
| 72 | const results = []; |
| 73 | let completed = 0; |
| 74 | |
| 75 | promises.forEach((promise, index) => { |
| 76 | Promise.resolve(promise) |
| 77 | .then((value) => { |
| 78 | results[index] = value; |
| 79 | }) |
| 80 | .catch((reason) => { |
| 81 | results[index] = reason; |
| 82 | }) |
| 83 | .finally(() => { |
| 84 | completed++; |
| 85 | |
| 86 | if (completed === promises.length) { |
| 87 | resolve(results); |
| 88 | } |
| 89 | }); |
| 90 | }); |
| 91 | }); |
| 92 | // Handled Edge Cases: Empty array of promises |
| 16 | 93 | }; |
| 17 | 94 | |
| 18 | | export const race = () => { |
| 19 | | throw new Error('Remove this line and implement the function'); |
| 95 | export const race = (promises) => { |
| 96 | // Edge Case: No arguments provided |
| 97 | if (promises === undefined) { |
| 98 | return Promise.resolve(undefined); |
| 99 | } |
| 100 | |
| 101 | // Edge Case: Empty array of promises |
| 102 | if (!Array.isArray(promises) || promises.length === 0) { |
| 103 | return Promise.resolve(undefined); |
| 104 | } |
| 105 | |
| 106 | return new Promise((resolve, reject) => { |
| 107 | promises.forEach((promise) => { |
| 108 | Promise.resolve(promise) |
| 109 | .then((value) => { |
| 110 | resolve(value); |
| 111 | }) |
| 112 | .catch((error) => { |
| 113 | reject(error); |
| 114 | }); |
| 115 | }); |
| 116 | }); |
| 117 | // Handled Edge Cases: Empty array of promises |
| 20 | 118 | }; |
| 21 | 119 | |
| 22 | | export const any = () => { |
| 23 | | throw new Error('Remove this line and implement the function'); |
| 120 | export const any = (promises) => { |
| 121 | // Edge Case: No arguments provided |
| 122 | if (promises === undefined) { |
| 123 | return Promise.resolve(undefined); |
| 124 | } |
| 125 | |
| 126 | // Edge Case: Empty array of promises |
| 127 | if (!Array.isArray(promises) || promises.length === 0) { |
| 128 | return Promise.reject([]); |
| 129 | } |
| 130 | |
| 131 | return new Promise((resolve, reject) => { |
| 132 | const errors = []; |
| 133 | let rejectedCount = 0; |
| 134 | |
| 135 | promises.forEach((promise, index) => { |
| 136 | Promise.resolve(promise) |
| 137 | .then((value) => { |
| 138 | resolve(value); |
| 139 | }) |
| 140 | .catch((error) => { |
| 141 | errors[index] = error; |
| 142 | rejectedCount++; |
| 143 | |
| 144 | // Edge Case: All rejected promises in any() method |
| 145 | if (rejectedCount === promises.length) { |
| 146 | reject(errors); |
| 147 | } |
| 148 | }); |
| 149 | }); |
| 150 | }); |
| 151 | // Handled Edge Cases: Empty array of promises, All rejected promises in any() method |
| 24 | 152 | }; |