在下面的思绪中,我是一个一个找他们借钱的,一个借不着再找另一个。我为什么不同时找他们借呢?谁借我了,我就转钱给家里。此时我想起了刚学的 Promise.race 办法,也许这个办法可以协助我表达我的这一决策需求.
function borrowMoneyFromOthers() {
// 同时向张三,李四,王五借钱,只需有人借我钱了,我就转钱给家里。
Promise.race([
tryBorrowMoneyFromZhangshan(),
tryBorrowMoneyFromLisi(),
tryBorrowMoneyFromWangwu()
])
.then(transferMoneyToHome)
.catch(reasons => {
console.warn("没一团体情愿给我借钱,他们理由是:", reasons);
});
}
我用timeout 模拟一下他们给我回答的,代码如下:
// 尝试找张三借
function tryBorrowMoneyFromZhangshan(): Promise<number> {
return new Promise(function(fulfill, reject) {
setTimeout(() => {
fulfill(300);
}, 100);
});
}
// 尝试找李四借
function tryBorrowMoneyFromLisi(): Promise<number> {
return new Promise(function(fulfill, reject) {
setTimeout(() => {
reject("对不起我也没钱");
}, 50);
});
}
// 尝试找王五借
function tryBorrowMoneyFromWangwu(): Promise<number> {
return new Promise(function(fulfill, reject) {
setTimeout(() => {
fulfill(300);
}, 500);
});
}
结果运转之后,控制台输入的是:
没一团体情愿给我借钱,他们理由是: 对不起我也没钱
看来 Promise.race 适用用来模拟抢答,而不是选择最优解。 比如多人抢答一个成绩,第一个抢答之后不论他回答的能否是正确,这个题都过了。
不过没关系。也许我可以本人写一个来叫做 promiseOne 的函数来完成这个功用。代码如下:
/**
* 当其中一个 Promise 兑现时,前往的 Promise 即被兑现
* @param promises Promise<T> 的数组
*/
function promiseOne<T>(promises: Promise<T>[]): Promise<T> {
const promiseCount = promises.length;
return new Promise<T>(function(resolve, reject) {
const reasons: any[] = [];
let rejectedCount = 0;
promises.forEach((promise, index) => {
promise.then(resolve).catch(reason => {
reasons[index] = reason;
rejectedCount++;
if (rejectedCount === promiseCount) {
reject(reasons);
}
});
});
});
}
(责任编辑:admin)