日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用Promise講一個悲傷的故事給你聽

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

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

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

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

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

如果李雷借我錢了,我就轉(zhuǎn)錢給家里,沒有,我應(yīng)該要再去找別人借了??梢杂孟旅娴暮瘮?shù)描述我此時的處境。

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

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

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

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

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

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

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

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

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

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

沒一個人愿意給我借錢,他們理由是: 對不起我也沒錢

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

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

 
 
 
  1. /**
  2.  * 當(dāng)其中一個 Promise 兌現(xiàn)時,返回的 Promise 即被兌現(xiàn)
  3.  * @param promises Promise 的數(shù)組
  4.  */
  5. function promiseOne(promises: Promise[]): Promise {
  6.   const promiseCount = promises.length;
  7.   return new Promise(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.   });
  20. }

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

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

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

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

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

 
 
 
  1. function betWorldCup() {
  2.   // 初始資金 300 塊
  3.   Promise.resolve(300)
  4.     .then(moeny => {
  5.       // 投西班牙
  6.       return new Promise(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(function(fulfil, reject) {
  20.         setTimeout(() => {
  21.           fulfil(ret * 1.2);
  22.         }, 92);
  23.       });
  24.     })
  25.     .then(ret => {
  26.       console.log("現(xiàn)在收益加本金共有: ", ret);
  27.     });
  28. }

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

 
 
 
  1. function betWorldCup() {
  2.   // 初始資金 300 塊
  3.   Promise.resolve(300)
  4.     .then(moeny => {
  5.       // 投西班牙
  6.       return new Promise(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ī)會好不好?, 失敗原因: ", reason);
  21.         // 再投 300
  22.         return 300;
  23.       }
  24.     )
  25.     .then(ret => {
  26.       // 投巴西
  27.       return new Promise(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("不要再買了");
  36.     })
  37.     .then(ret => {
  38.       console.info("準(zhǔn)備再買嗎?");
  39.     })
  40.     .catch(reason => {
  41.       console.log("出錯了:", reason);
  42.     });
  43. }

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

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

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


當(dāng)前名稱:用Promise講一個悲傷的故事給你聽
本文來源:http://m.5511xx.com/article/cocehip.html