作者:安静
function isPromise(value) {if (typeof value === "function" ||(typeof value === "object" && value !== null)) {if (typeof value.then === "function") {return true;}}return false;}Promise.myRace1 = (values) => {return new Promise((resolve, reject) => {for (let i = 0; i < values.length; i++) {const current = values[i];if (isPromise(current)) {current.then(resolve, reject); //一旦成功就直接停止} else {resolve(current);}}});};
作者:
作者:gochri
/*** @param {Array/Map/Set[Promise]} promiseList* @return {Promise}*/const promiseRace = (promiseList = []) => {return new Promise((resolve, reject) => {// [] 时永远等待// if (promiseList.length === 0) { resolve() }for (let i in promiseList) {let promise = promiseList[i];Promise.resolve(promise).then((res) => {// return first resolveresolve(res);}).catch((rej) => {// return first rejectreject(rej);});}});};// ------- Test Case -------let promise = Promise.resolve(1);let promise1, promise2, promise3;// Case 1promise = promiseRace([]);// promise// .then((values) => {// console.log("values", values);// })// .catch((error) => {// console.log("error", error);// });// values undefined// Case 5:default case// promise1 = new Promise((resolve, reject) => {// setTimeout(resolve, 500, 'one');// });// promise2 = new Promise((resolve, reject) => {// setTimeout(resolve, 100, 'two');// });// promiseRace([promise1, promise2]).then((value) => {// console.log(value);// // Both resolve, but promise2 is faster// });// expected output: "two"// Case 6: 异步性// var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];// var p = promiseRace(resolvedPromisesArray);// // immediately logging the value of p// console.log(p);// // using setTimeout we can execute code after the stack is empty// setTimeout(function () {// console.log('the stack is now empty');// console.log(p);// });// Promise { <pending> }// {/* the stack is now empty */ }// {/* Promise { 33 } */ }// Case7: setTimeoutvar p1 = new Promise(function (resolve, reject) {setTimeout(resolve, 500, "one");});var p2 = new Promise(function (resolve, reject) {setTimeout(resolve, 100, "two");});promiseRace([p1, p2]).then(function (value) {console.log(value); // "two"// 两个都完成,但 p2 更快});var p3 = new Promise(function (resolve, reject) {setTimeout(resolve, 100, "three");});var p4 = new Promise(function (resolve, reject) {setTimeout(reject, 500, "four");});promiseRace([p3, p4]).then(function (value) {console.log(value); // "three"// p3 更快,所以它完成了}, function (reason) {// 未被调用});var p5 = new Promise(function (resolve, reject) {setTimeout(resolve, 500, "five");});var p6 = new Promise(function (resolve, reject) {setTimeout(reject, 100, "six");});promiseRace([p5, p6]).then(function (value) {// 未被调用}, function (reason) {console.log(reason); // "six"// p6 更快,所以它失败了});// two// three// six
作者:奥兰度
Promise.myRace = (promiseList) => {return new Promise((resolve, reject) => {promiseList.forEach(promise => {promise.then(val => {resolve(val)}).catch(err => {reject(err)})})})}
