作者:安静
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 resolve
resolve(res);
})
.catch((rej) => {
// return first reject
reject(rej);
});
}
});
};
// ------- Test Case -------
let promise = Promise.resolve(1);
let promise1, promise2, promise3;
// Case 1
promise = 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: setTimeout
var 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)
})
})
})
}