成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Promise講一個(gè)悲傷的故事給你聽(tīng)

開(kāi)發(fā) 前端
那天我正在學(xué)習(xí) Promise,突然家里打電話過(guò)來(lái)說(shuō),家里蓋房子要錢(qián)。我工作這么多年了,從事著別人眼中高薪工作,于是滿口答應(yīng)下來(lái)。但是由于我并沒(méi)有錢(qián),于是我跟家里說(shuō),等過(guò)幾天我再打錢(qián)過(guò)去。我也好乘著這幾天想想辦法。

[[234989]]

那天我正在學(xué)習(xí) Promise,突然家里打電話過(guò)來(lái)說(shuō),家里蓋房子要錢(qián)。我工作這么多年了,從事著別人眼中高薪工作,于是滿口答應(yīng)下來(lái)。但是由于我并沒(méi)有錢(qián),于是我跟家里說(shuō),等過(guò)幾天我再打錢(qián)過(guò)去。我也好乘著這幾天想想辦法。

首先我找到我的同學(xué)李雷,他現(xiàn)在一個(gè)部門(mén)經(jīng)理了,我想應(yīng)該他應(yīng)該有錢(qián)。我跟他說(shuō)明了借錢(qián)的意向,李雷二話不說(shuō)就答應(yīng)借我300,不過(guò)同時(shí)表示要回家跟老婆商量商量,我說(shuō)好。此時(shí)我想起來(lái)答應(yīng)或者說(shuō)承諾的英文單詞就是 Promise 。承諾的結(jié)果是錢(qián),錢(qián)是數(shù)值(number 類型)。于是我想把我要借錢(qián)的這一行為寫(xiě)成一個(gè) TypeScript 函數(shù)如下:

 

  1. // 向李雷借錢(qián),李雷丟給我一個(gè)承諾 
  2. function borrowMoneyFromLiLei(): Promise<number> { 
  3.   return new Promise<number>(function(fulfill, reject) { 
  4.      // 李雷跟老婆商量中 
  5.   }); 

此時(shí),我在想李雷老婆會(huì)答應(yīng)給我借300塊嗎?我不確定,就像薛定諤的貓。借還是不借,這是一個(gè)問(wèn)題。然后我發(fā)現(xiàn)這也可以寫(xiě)成一個(gè)函數(shù)。借或者不借用布爾值來(lái)表示 (boolean 類型)。函數(shù)如下:

 

  1. // 李雷的老婆是否會(huì)答應(yīng)給我借錢(qián)? 
  2. function willLiLeiWifeLendMeMoeny(): Promise<boolean> { 
  3.   return new Promise<boolean>(function(lend, reject) { 
  4.     // 借還是不借 
  5.   }); 

如果李雷借我錢(qián)了,我就轉(zhuǎn)錢(qián)給家里,沒(méi)有,我應(yīng)該要再去找別人借了。可以用下面的函數(shù)描述我此時(shí)的處境。

 

  1. function transferMoneyToHome(money: number) { 
  2.     // 給家里轉(zhuǎn)錢(qián) 
  3. function mySituation(){ 
  4.     borrowMoneyFromLiLei() 
  5.     .then((money:number) => { 
  6.         // 如果李雷借我錢(qián)了,我就轉(zhuǎn)錢(qián)給家里. 
  7.         transferMoneyToHome(money) 
  8.     }).catch((reason) => { 
  9.         // 李雷老婆拒絕借錢(qián)給我。 那我應(yīng)該考慮向其他人借了。 
  10.         borrowMoneyFromOthers() 
  11.     }) 

找其他人借,我能想到就(張三,李四,五五)這三個(gè)人了,其他的朋友很少聯(lián)系,突然說(shuō)借錢(qián)也不好。于是我嘗試向他們借錢(qián)。用代碼表示是這樣子的:

  1. function borrowMoneyFromOthers() { 
  2.   // 我先試著向張三借 
  3.   tryBorrowMoneyFromZhangshan() 
  4.     .then(money => { 
  5.       transferMoneyToHome(money); 
  6.     }) 
  7.     .catch(reason => { 
  8.       // 如果張三不借,并丟給我一個(gè)理由 
  9.       // 試著向李四借 
  10.       tryBorrowMoneyFromLisi() 
  11.         .then(money => { 
  12.           transferMoneyToHome(money); 
  13.         }) 
  14.         .catch(reason2 => { 
  15.           // 如果 李四也不肯錯(cuò) 
  16.           // 再試試向王五借 
  17.           tryBorrowMoneyFromWangwu() 
  18.             .then(money => { 
  19.               transferMoneyToHome(money); 
  20.             }) 
  21.             .catch(reason => { 
  22.               // 沒(méi)有人肯借 
  23.               throw new Error("我該怎么辦呢?"); 
  24.             }); 
  25.         }); 
  26.     }); 

由于借著錢(qián)之后都是向家里轉(zhuǎn)錢(qián),所以上面的代碼應(yīng)該簡(jiǎn)化一下。簡(jiǎn)化后如下:

 

  1. function borrowMoneyFromOthers() { 
  2.   // 我先試著向張三借 
  3.   tryBorrowMoneyFromZhangshan() 
  4.     .then(transferMoneyToHome) 
  5.     .catch(reason => { 
  6.       // 如果張三不借,并丟給我一個(gè)理由 
  7.       // 試著向李四借 
  8.       tryBorrowMoneyFromLisi() 
  9.         .then(transferMoneyToHome) 
  10.         .catch(reason2 => { 
  11.           // 如果 李四也不肯錯(cuò) 
  12.           // 再試試向王五借 
  13.           tryBorrowMoneyFromWangwu() 
  14.             .then(transferMoneyToHome) 
  15.             .catch(reason => { 
  16.               // 沒(méi)有人肯借 
  17.               throw new Error("我該怎么辦呢?"); 
  18.             }); 
  19.         }); 
  20.     }); 

在上面的思路中,我是一個(gè)一個(gè)找他們借錢(qián)的,一個(gè)借不著再找另一個(gè)。我為什么不同時(shí)找他們借呢?誰(shuí)借我了,我就轉(zhuǎn)錢(qián)給家里。此時(shí)我想起了剛學(xué)的 Promise.race 方法,也許這個(gè)方法可以幫助我表達(dá)我的這一決策需求.

 

  1. function borrowMoneyFromOthers() { 
  2.   // 同時(shí)向張三,李四,王五借錢(qián),只要有人借我錢(qián)了,我就轉(zhuǎn)錢(qián)給家里。 
  3.   Promise.race([ 
  4.     tryBorrowMoneyFromZhangshan(), 
  5.     tryBorrowMoneyFromLisi(), 
  6.     tryBorrowMoneyFromWangwu() 
  7.   ]) 
  8.     .then(transferMoneyToHome) 
  9.     .catch(reasons => { 
  10.       console.warn("沒(méi)一個(gè)人愿意給我借錢(qián),他們理由是:", reasons); 
  11.     }); 

我用timeout 模擬一下他們給我答復(fù)的,代碼如下:

 

  1. // 嘗試找張三借 
  2. function tryBorrowMoneyFromZhangshan(): Promise<number> { 
  3.   return new Promise(function(fulfill, reject) { 
  4.     setTimeout(() => { 
  5.       fulfill(300); 
  6.     }, 100); 
  7.   }); 
  8. // 嘗試找李四借 
  9. function tryBorrowMoneyFromLisi(): Promise<number> { 
  10.   return new Promise(function(fulfill, reject) { 
  11.     setTimeout(() => { 
  12.       reject("對(duì)不起我也沒(méi)錢(qián)"); 
  13.     }, 50); 
  14.   }); 
  15. // 嘗試找王五借 
  16. function tryBorrowMoneyFromWangwu(): Promise<number> { 
  17.   return new Promise(function(fulfill, reject) { 
  18.     setTimeout(() => { 
  19.       fulfill(300); 
  20.     }, 500); 
  21.   }); 

結(jié)果運(yùn)行之后,控制臺(tái)輸出的是:

沒(méi)一個(gè)人愿意給我借錢(qián),他們理由是: 對(duì)不起我也沒(méi)錢(qián)

看來(lái) Promise.race 適用用來(lái)模擬搶答,而不是選擇最優(yōu)解。 比如多人搶答一個(gè)問(wèn)題,第一個(gè)搶答之后不論他回答的是否是正確,這個(gè)題都過(guò)了。

不過(guò)沒(méi)關(guān)系。也許我可以自己寫(xiě)一個(gè)來(lái)叫做 promiseOne 的函數(shù)來(lái)實(shí)現(xiàn)這個(gè)功能。代碼如下:

 

  1. /** 
  2.  * 當(dāng)其中一個(gè) Promise 兌現(xiàn)時(shí),返回的 Promise 即被兌現(xiàn) 
  3.  * @param promises Promise<T> 的數(shù)組 
  4.  */ 
  5. function promiseOne<T>(promises: Promise<T>[]): Promise<T> { 
  6.   const promiseCount = promises.length; 
  7.   return new Promise<T>(function(resolve, reject) { 
  8.     const reasons: any[] = []; 
  9.     let rejectedCount = 0; 
  10.     promises.forEach((promise, index) => { 
  11.       promise.then(resolve).catch(reason => { 
  12.         reasons[index] = reason; 
  13.         rejectedCount++; 
  14.         if (rejectedCount === promiseCount) { 
  15.           reject(reasons); 
  16.         } 
  17.       }); 
  18.     }); 
  19.   }); 

正當(dāng)我寫(xiě)完了上面的代碼,他們?nèi)齻€(gè)給我回話了,說(shuō)是現(xiàn)在手上也沒(méi)有那么多錢(qián),但是可以給我借100. 于是我現(xiàn)在需要處理這樣的事情,就是當(dāng)他們?nèi)齻€(gè)人把錢(qián)都轉(zhuǎn)給我之后我再轉(zhuǎn)給家里。 當(dāng)他們?nèi)齻€(gè)都兌換借我100塊錢(qián)的承諾時(shí),可以用 Promise.all 來(lái)表示,代碼如下:

 

  1. function borrowMoneyFromOthers() { 
  2.   // 同時(shí)向張三,李四,王五借錢(qián), 借到之后,我就轉(zhuǎn)錢(qián)給家里。 
  3.   Promise.all([ 
  4.     tryBorrowMoneyFromZhangshan(), 
  5.     tryBorrowMoneyFromLisi(), 
  6.     tryBorrowMoneyFromWangwu() 
  7.   ]) 
  8.     .then(moneyArray => { 
  9.       console.info("借到錢(qián)啦:", moneyArray); 
  10.       const totalMoney = moneyArray.reduce((acc, cur) => acc + cur); 
  11.       transferMoneyToHome(totalMoney); 
  12.     }) 
  13.     .catch(reasons => { 
  14.       console.warn("有人不愿意給我借錢(qián),理由是:", reasons); 
  15.     }); 

現(xiàn)在有三個(gè)人愿意給我借錢(qián)了,嗯,也就是說(shuō)我借到了 300 塊。然而這錢(qián)用來(lái)建房還是杯水車薪。所以我還得想辦法。我想我要不要試試用這300塊來(lái)買(mǎi)一下彩票。如果中了,說(shuō)不定這事就成了。

 

  1. function buyLottery(bet: number): Promise<number> { 
  2.   return new Promise(function(fulfill, resolve) { 
  3.     // 投注 
  4.     // 等待開(kāi)獎(jiǎng) 
  5.     setTimeout(() => { 
  6.       resolve("很遺憾你沒(méi)有買(mǎi)中"); 
  7.     }, 100); 
  8.   }); 
  9.  
  10. function borrowMoneyFromOthers() { 
  11.   // 同時(shí)向張三,李四,王五借錢(qián),  
  12.   Promise.all([ 
  13.     tryBorrowMoneyFromZhangshan(), 
  14.     tryBorrowMoneyFromLisi(), 
  15.     tryBorrowMoneyFromWangwu() 
  16.   ]) 
  17.     .then(moneyArray => { 
  18.       console.info("借到錢(qián)啦:", moneyArray); 
  19.       const totalMoney = moneyArray.reduce((acc, cur) => acc + cur); 
  20.       // 購(gòu)買(mǎi)彩票 
  21.       buyLottery(totalMoney) 
  22.         .then(transferMoneyToHome) 
  23.         .catch(reason => { 
  24.           console.log("沒(méi)中,", reason); 
  25.         }); 
  26.     }) 
  27.     .catch(reasons => { 
  28.       console.warn("有人不愿意給我借錢(qián),理由是:", reasons); 
  29.     }); 

我知道很大概率我是買(mǎi)不中的,最近世界杯開(kāi)賽了,我幻想著壓注世界杯,而且世界杯場(chǎng)次多,一天好幾場(chǎng),一場(chǎng)買(mǎi)中的盈利還可以投入到下一場(chǎng)。我把我的幻想寫(xiě)成代碼,大概就是下面這樣。

 

  1. function betWorldCup() { 
  2.   // 初始資金 300 塊 
  3.   Promise.resolve(300) 
  4.     .then(moeny => { 
  5.       // 投西班牙 
  6.       return new Promise<number>(function(fulfil, reject) { 
  7.         setTimeout(() => { 
  8.           // 假假設(shè) 賠率 1.2 
  9.           fulfil(moeny * 1.2); 
  10.         }, 100); 
  11.       }); 
  12.     }) 
  13.     .then(ret => { 
  14.       // 投英格蘭 
  15.       return ret * 1.2; 
  16.     }) 
  17.     .then(ret => { 
  18.       // 投巴西 
  19.       return new Promise<number>(function(fulfil, reject) { 
  20.         setTimeout(() => { 
  21.           fulfil(ret * 1.2); 
  22.         }, 92); 
  23.       }); 
  24.     }) 
  25.     .then(ret => { 
  26.       console.log("現(xiàn)在收益加本金共有: ", ret); 
  27.     }); 

我想,如果第一場(chǎng)投失敗了,應(yīng)該再給自己一次機(jī)會(huì)。于是將代碼修改如下:

 

  1. function betWorldCup() { 
  2.   // 初始資金 300 塊 
  3.   Promise.resolve(300) 
  4.     .then(moeny => { 
  5.       // 投西班牙 
  6.       return new Promise<number>(function(fulfil, reject) { 
  7.         setTimeout(() => { 
  8.           // 假假設(shè) 賠率 1.2 
  9.           // fulfil(moeny * 1.2); 
  10.           reject("莊家跑跑路了"); 
  11.         }, 100); 
  12.       }); 
  13.     }) 
  14.     .then
  15.       ret => { 
  16.         // 投英格蘭 
  17.         return ret * 1.2; 
  18.       }, 
  19.       reason => { 
  20.         console.info("第一次投注失敗,再給一次機(jī)會(huì)好不好?, 失敗原因: ", reason); 
  21.         // 再投 300 
  22.         return 300; 
  23.       } 
  24.     ) 
  25.     .then(ret => { 
  26.       // 投巴西 
  27.       return new Promise<number>(function(fulfil, reject) { 
  28.         setTimeout(() => { 
  29.           fulfil(ret * 1.2); 
  30.         }, 92); 
  31.       }); 
  32.     }) 
  33.     .then(ret => { 
  34.       console.log("現(xiàn)在收益加本金共有: ", ret); 
  35.       throw new Error("不要再買(mǎi)了"); 
  36.     }) 
  37.     .then(ret => { 
  38.       console.info("準(zhǔn)備再買(mǎi)嗎?"); 
  39.     }) 
  40.     .catch(reason => { 
  41.       console.log("出錯(cuò)了:", reason); 
  42.     }); 

此時(shí)如下運(yùn)行上面的函數(shù)會(huì)得到如下輸出:

  • 第一次投注失敗,再給一次機(jī)會(huì)好不好?, 失敗原因: 莊家跑跑路了
  • 現(xiàn)在收益加本金共有: 360
  • 出錯(cuò)了:
  • Error: 不要再買(mǎi)了

然而,幻想結(jié)束之后,我依然得苦苦思考怎么樣籌錢(qián)。

責(zé)任編輯:未麗燕 來(lái)源: 程序師
相關(guān)推薦

2018-06-23 08:02:31

程序員代碼故事

2015-11-12 09:47:28

2015-08-13 14:35:43

2022-12-22 08:22:17

Python圖像圖像處理

2015-08-05 09:45:25

IOS故事多線程

2024-01-08 13:40:00

并發(fā)安全? 數(shù)量

2015-11-06 09:45:21

2020-09-06 22:59:35

Linux文件命令

2021-09-12 17:23:57

canvas動(dòng)畫(huà)函數(shù)

2020-09-24 11:46:03

Promise

2023-01-30 16:21:24

Linux外觀

2009-09-02 17:51:36

.NET委托

2024-05-20 01:10:00

Promise變量

2021-04-28 08:21:21

Promise.any服務(wù)器場(chǎng)景

2021-04-27 08:31:37

Promisereject信息

2021-08-04 17:55:38

keysRedis數(shù)據(jù)庫(kù)

2025-06-13 09:40:45

2020-06-23 10:03:33

版本控制項(xiàng)目

2012-11-29 09:49:17

軟件項(xiàng)目項(xiàng)目

2019-05-30 10:15:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 蜜桃视频成人 | 国产免国产免费 | 成人精品啪啪欧美成 | 网色 | 涩涩视频大全 | 成人免费看电影 | 国产日韩精品一区 | www.操com | 91电影| 精品久久久久久久久久久久 | 男人的天堂在线视频 | 爱爱免费视频 | 亚洲 自拍 另类 欧美 丝袜 | 国产农村一级片 | 日韩欧美一级片 | 久久久中文 | 欧美一区二区三区在线观看视频 | 国产馆 | 毛片一级片 | 久久99深爱久久99精品 | 自拍偷拍一区二区三区 | 久久亚洲一区 | 午夜影院官网 | 在线免费观看成人 | 97天天干 | 欧洲亚洲精品久久久久 | 华丽的挑战在线观看 | 91欧美精品成人综合在线观看 | 国产黄色小视频在线观看 | 亚洲精品一二区 | 毛片一区 | 日本精品久久久一区二区三区 | 成人一区二区三区 | 一级大黄 | 午夜理伦三级理论三级在线观看 | 国产欧美视频一区 | 国产欧美在线观看 | 全免费a级毛片免费看视频免费下 | 国产精品久久九九 | 精品国产成人 | 精品一区二区三区av |