那天我正在学习 Promise,突然家里打电话过来说,家里盖房子要钱。我工作这么多年了,从事着别人眼中高薪工作,于是满口答应下来。但是由于我并没有钱,于是我跟家里说,等过几天我再打钱过去。我也好乘着这几天想想办法。
首先我找到我的同学李雷,他现在一个部门经理了,我想应该他应该有钱。我跟他说明了借钱的意向,李雷二话不说就答应借我300,不过同时表示要回家跟老婆商量商量,我说好。此时我想起来答应或者说承诺的英文单词就是 Promise
。承诺的结果是钱,钱是数值(number 类型)。于是我想把我要借钱的这一行为写成一个TypeScript
函数如下:
// 向李雷借钱,李雷丢给我一个承诺
function borrowMoneyFromLiLei(): Promise<number> {return new Promise<number>(function(fulfill, reject) {// 李雷跟老婆商量中});
}
此时,我在想李雷老婆会答应给我借300块吗?我不确定,就像薛定谔的猫。借还是不借,这是一个问题。然后我发现这也可以写成一个函数。借或者不借用布尔值来表示 (boolean 类型)。函数如下:
// 李雷的老婆是否会答应给我借钱?
function willLiLeiWifeLendMeMoeny(): Promise<boolean> {return new Promise<boolean>(function(lend, reject) {// 借还是不借});
}
function transferMoneyToHome(money: number) {// 给家里转钱
}
function mySituation(){borrowMoneyFromLiLei().then((money:number) => {// 如果李雷借我钱了,我就转钱给家里.transferMoneyToHome(money)}).catch((reason) => {// 李雷老婆拒绝借钱给我。 那我应该考虑向其他人借了。borrowMoneyFromOthers()})
}
function borrowMoneyFromOthers() {// 我先试着向张三借tryBorrowMoneyFromZhangshan().then(money => {transferMoneyToHome(money);}).catch(reason => {// 如果张三不借,并丢给我一个理由// 试着向李四借tryBorrowMoneyFromLisi().then(money => {transferMoneyToHome(money);}).catch(reason2 => {// 如果 李四也不肯错// 再试试向王五借tryBorrowMoneyFromWangwu().then(money => {transferMoneyToHome(money);}).catch(reason => {// 没有人肯借throw new Error("我该怎么办呢?");});});});
}
function borrowMoneyFromOthers() {// 我先试着向张三借tryBorrowMoneyFromZhangshan().then(transferMoneyToHome).catch(reason => {// 如果张三不借,并丢给我一个理由// 试着向李四借tryBorrowMoneyFromLisi().then(transferMoneyToHome).catch(reason2 => {// 如果 李四也不肯错// 再试试向王五借tryBorrowMoneyFromWangwu().then(transferMoneyToHome).catch(reason => {// 没有人肯借throw new Error("我该怎么办呢?");});});});
}
Promise.race
方法,也许这个方法可以帮助我表达我的这一决策需求. function borrowMoneyFromOthers() {// 同时向张三,李四,王五借钱,只要有人借我钱了,我就转钱给家里。Promise.race([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()]).then(transferMoneyToHome).catch(reasons => {console.warn("没一个人愿意给我借钱,他们理由是:", reasons);});
}
// 尝试找张三借
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);}});});});
}
Promise.all
来表示,代码如下: function borrowMoneyFromOthers() {// 同时向张三,李四,王五借钱, 借到之后,我就转钱给家里。Promise.all([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()]).then(moneyArray => {console.info("借到钱啦:", moneyArray);const totalMoney = duce((acc, cur) => acc + cur);transferMoneyToHome(totalMoney);}).catch(reasons => {console.warn("有人不愿意给我借钱,理由是:", reasons);});
}
function buyLottery(bet: number): Promise<number> {return new Promise(function(fulfill, resolve) {// 投注// 等待开奖setTimeout(() => {resolve("很遗憾你没有买中");}, 100);});
}function borrowMoneyFromOthers() {// 同时向张三,李四,王五借钱, Promise.all([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()]).then(moneyArray => {console.info("借到钱啦:", moneyArray);const totalMoney = duce((acc, cur) => acc + cur);// 购买彩票buyLottery(totalMoney).then(transferMoneyToHome).catch(reason => {console.log("没中,", reason);});}).catch(reasons => {console.warn("有人不愿意给我借钱,理由是:", reasons);});
}
function betWorldCup() {// 初始资金 300 块solve(300).then(moeny => {// 投西班牙return new Promise<number>(function(fulfil, reject) {setTimeout(() => {// 假假设 赔率 1.2fulfil(moeny * 1.2);}, 100);});}).then(ret => {// 投英格兰return ret * 1.2;}).then(ret => {// 投巴西return new Promise<number>(function(fulfil, reject) {setTimeout(() => {fulfil(ret * 1.2);}, 92);});}).then(ret => {console.log("现在收益加本金共有: ", ret);});
}
function betWorldCup() {// 初始资金 300 块solve(300).then(moeny => {// 投西班牙return new Promise<number>(function(fulfil, reject) {setTimeout(() => {// 假假设 赔率 1.2// fulfil(moeny * 1.2);reject("庄家跑跑路了");}, 100);});}).then(ret => {// 投英格兰return ret * 1.2;},reason => {console.info("第一次投注失败,再给一次机会好不好?, 失败原因: ", reason);// 再投 300return 300;}).then(ret => {// 投巴西return new Promise<number>(function(fulfil, reject) {setTimeout(() => {fulfil(ret * 1.2);}, 92);});}).then(ret => {console.log("现在收益加本金共有: ", ret);throw new Error("不要再买了");}).then(ret => {console.info("准备再买吗?");}).catch(reason => {console.log("出错了:", reason);});
}
第一次投注失败,再给一次机会好不好?, 失败原因: 庄家跑跑路了
现在收益加本金共有: 360
出错了:
Error: 不要再买了
本文发布于:2024-01-27 10:33:37,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063228151191.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |