那天我正在学Promise,突然家里打来电话说家里需要钱盖房子。我工作这么多年,从事的是一份别人眼中高薪的工作,所以我完全同意。但是因为我没有钱,我就跟家里人说过几天我会寄钱。倒不如趁着这几天想想办法。首先,我找到了我的同学李磊。他现在是部门经理。我觉得他应该很有钱。我跟他说明了借钱的意思,李雷二话没说就同意借我300,同时说回家和他老婆商量一下,我就答应了。这时,我想起了承诺或诺言的英文单词是Promise。承诺的结果是金钱,金钱是一个值(数字类型)。所以我想把借钱的行为写成一个TypeScript函数,如下所示://向李磊借钱,李磊给我一个承诺reject){//李磊在和他老婆商量});}这时候我在想李磊老婆会不会同意借我300块钱?我不确定,就像薛定谔的猫一样。借还是不借,这是个问题。然后我发现这个也可以写成一个函数。借用或不借用一个布尔值来表示(boolean类型)。函数如下://李磊的老婆会同意借钱给我吗?functionwillLiLeiWifeLendMeMoeny():Promise{returnnewPromise(function(lend,reject){//借还是不借});}如果李雷借我钱,我会把钱转给家人,不,我应该向别人借。可以用下面的函数来描述我此时的情况。functiontransferMoneyToHome(money:number){//给家里转钱}functionmySituation(){borrowMoneyFromLiLei().then((money:number)=>{//如果李磊借钱给我,我就给家里转钱.transferMoneyToHome(money)}).catch((reason)=>{//李雷的老婆不肯借钱,那我就考虑找别人借了。borrowMoneyFromOthers()})}找其他人借钱,我能想到(张三,李四,吴舞)这三个人,其他朋友很少联系,突然说借钱不好。所以我试着向他们借钱。代码中是这样的:functionborrowMoneyFromOthers(){//我尝试先向张三借tryBorrowMoneyFromZhangshan().then(money=>{transferMoneyToHome(money);}).catch(reason=>{//如果张三不要借,给我一个理由//试试跟丽丝借tryBorrowMoneyFromLisi().then(money=>{transferMoneyToHome(money);}).catch(reason2=>{//如果丽丝也拒绝错//试试再找王五借tryBorrowMoneyFromWangwu().then(money=>{transferMoneyToHome(money);}).catch(reason=>{//没人愿意借thrownewError("WhatshouldIdo?");});});});}由于钱是借钱后转给家里的,所以上面的代码要简化。简化如下:functionborrowMoneyFromOthers(){//我先尝试向张三借tryBorrowMoneyFromZhangshan().then(transferMoneyToHome).catch(reason=>{//如果张三不借,给我一个理由//尝试向李四借tryBorrowMoneyFromLisi().then(transferMoneyToHome).catch(reason2=>{//如果李四也拒绝出错//尝试向王五借tryBorrowMoneyFromWangwu().then(transferMoneyToHome).catch(reason=>{//没有人愿意借thrownewError("WhatshouldIdo?");});});});}在上面的思考中,我一一向他们借钱,一个也借不了找另一个。我为什么不让他们同时借呢?谁借给我,我就把钱转给家里。这时我想起了刚刚学习的Promise.race方法。也许这种方法可以帮助我表达我的决策需求。functionborrowMoneyFromOthers(){//同时向张三、李四、王舞借钱,只要有人借我,钱用完了,我就把钱转给家里人。Promise.race([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()]).then(transferMoneyToHome).catch(reasons=>{console.warn("没有人愿意借钱给我,他们的理由是:",reasons);});}我用timeout模拟他们给我的答案,代码如下://尝试借鉴张三的functiontryBorrowMoneyFromZhangshan():Promise{returnnewPromise(function(fulfill,reject){setTimeout(()=>{fulfill(300);},100);});}//尝试借鉴Lisi函数tryBorrowMoneyFromLisi():Promise{returnnewPromise(function(fulfill,reject){setTimeout(()=>{reject("对不起我没有钱");},50);});}//尝试向王屋借钱函数tryBorrowMoneyFromWangwu():Promise{returnnewPromise(function(fulfill,reject){setTimeout(()=>{fulfill(300);},500);});}结果运行后,控制台输出为:没有人愿意借钱给我。他们的理由是:对不起,我没钱。Promise.race似乎适用于模拟抢答,而不是选择最优解。比如多人抢答一个问题,第一个抢答完后,不管他答对不对,这个问题都会通过。但没关系。也许我可以编写自己的名为promiseOne的函数来执行此操作。代码如下:/***当其中一个Promise被fulfilled时,返回的Promise被fulfilled*@parampromisesPromisearray*/functionpromiseOne(promises:Promise[]):Promise{constpromiseCount=承诺。长度;returnnewPromise(function(resolve,reject){constreasons:any[]=[];letrejectedCount=0;promises.forEach((promise,index)=>{promise.then(resolve).catch(reason=>{reasons[index]=reason;rejectedCount++;if(rejectedCount===promiseCount){reject(reasons);}});});});}刚写完上面的代码,他们三个给我打了电话回来,说我现在没有那么多钱,但是我可以借100。所以我现在需要处理这种事情,就是他们三个把钱都转给我之后,我再转它给我的家人。当他们三人都兑现借给我100元的承诺时,可以用Promise.all表示,代码如下:functionborrowMoneyFromOthers(){//同时向张三、李四、王五借钱时间。借完钱,我就把钱转给家里。Promise.all([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()]).then(moneyArray=>{console.info("我借了钱:",moneyArray);consttotalMoney=moneyArray.reduce((acc,cur)=>acc+cur);transferMoneyToHome(totalMoney);}).catch(reasons=>{console.warn("有人不愿意借钱给我,原因是:",reasons);});}现在有三个人愿意借我钱,嗯,也就是说我借了300元。但是,盖房子的钱还是九牛一毛。所以还是得想个办法。我想我应该试着用这300元去买一张彩票。如果你赢了,说不定这件事就完成了。functionbuyLottery(bet:number):Promise{returnnewPromise(function(fulfill,resolve){//betting//等待开奖setTimeout(()=>{resolve("很遗憾你没买");},100);});}functionborrowMoneyFromOthers(){//同时向张三、李四、王五借钱,Promise.all([tryBorrowMoneyFromZhangshan(),tryBorrowMoneyFromLisi(),tryBorrowMoneyFromWangwu()])。then(moneyArray=>{console.info("我借了钱:",moneyArray);consttotalMoney=moneyArray.reduce((acc,cur)=>acc+cur);//买彩票buyLottery(totalMoney).then(transferMoneyToHome).catch(reason=>{console.log("Failed,",reason);});}).catch(reasons=>{console.warn("有人不愿意借钱给我,原因是:",reasons);});}我知道我很可能不会赢。世界杯最近开始了。幻想着赌世界杯,世界杯比赛很多。一天有几场比赛。我把自己的幻想写成了代码,大致是这样的。functionbetWorldCup(){//初始资金为300Promise.resolve(300).then(moeny=>{//BetSpainreturnnewPromise(function(fulfil,reject){setTimeout(()=>{//False假设赔率1.2fulfil(moeny*1.2);},100);});}).then(ret=>{//VoteEnglandreturnret*1.2;}).then(ret=>{//VoteBrazilreturnnewPromise(function(fulfil,reject){setTimeout(()=>{fulfil(ret*1.2);},92);});}).then(ret=>{console.log("现在收入加上costJinGong:",ret);});}我觉得,如果第一轮失败了,你应该再给自己一次机会。所以修改代码如下:functionbetWorldCup(){//Initialfund300Promise.resolve(300).then(moeny=>{//VoteforSpainreturnnewPromise(function(fulfil,reject){setTimeout(()=>{//假设赔率是1.2//fulfil(moeny*1.2);reject("庄家跑了");},100);});}).then(ret=>{//VoteforEnglandreturnret*1.2;},reason=>{console.info("第一次投注失败,再给一次机会如何?,失败原因:",reason);//重新投注300return300;}).then(ret=>{//巴西returnnewPromise(function(fulfil,reject){setTimeout(()=>{fulfil(ret*1.2);},92);});}).then(ret=>{console.log("总收入加本金:",ret);thrownewError("不要再买");}).then(ret=>{console.info("你准备好再买了吗?");}).catch(reason=>{console.log("Anerroroccurred:",reason);});}这时候,如果你按如下方式运行上面的函数,你会得到如下输出:投注失败,请再给一次机会?,失败原因:庄家跑路。现在的总利润加上本金:360错误:错误:不要再买了。然而,幻想结束后,我还得苦思冥想如何筹集资金。