用 Promise 描述乙個悲傷的故事

2021-09-12 01:12:54 字數 3531 閱讀 1856

那天我正在學習 promise,突然家裡打**過來說,家裡蓋房子要錢。我工作這麼多年了,從事著別人眼中高薪工作,於是滿口答應下來。但是由於我並沒有錢,於是我跟家裡說,等過幾天我再打錢過去。我也好乘著這幾天想想辦法。

首先我找到我的同學李雷,他現在乙個部門經理了,我想應該他應該有錢。我跟他說明了借錢的意向,李雷二話不說就答應借我300,不過同時表示要回家跟老婆商量商量,我說好。此時我想起來答應或者說承諾的英文單詞就是promise。承諾的結果是錢,錢是數值(number 型別)。於是我想把我要借錢的這一行為寫成乙個typescript函式如下:

// 向李雷借錢,李雷丟給我乙個承諾

function

borrowmoneyfromlilei(): promise

);}複製**

此時,我在想李雷老婆會答應給我借300塊嗎?我不確定,就像薛丁格的貓。借還是不借,這是乙個問題。然後我發現這也可以寫成乙個函式。借或者不借用布林值來表示 (boolean 型別)。函式如下:

// 李雷的老婆是否會答應給我借錢?

function

willlileiwifelendmemoeny(): promise

);}複製**

如果李雷借我錢了,我就轉錢給家裡,沒有,我應該要再去找別人借了。可以用下面的函式描述我此時的處境。

function

transfermoneytohome(money: number

) function

mysituation()).catch((reason) => )

}複製**

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

function

borrowmoneyfromothers() )

.catch(reason => )

.catch(reason2 => )

.catch(reason => );

});});

}複製**

由於藉著錢之後都是向家裡轉錢,所以上面的**應該簡化一下。簡化後如下:

function

borrowmoneyfromothers() );

});});

}複製**

在上面的思路中,我是乙個乙個找他們借錢的,乙個借不著再找另乙個。我為什麼不同時找他們借呢?誰借我了,我就轉錢給家裡。此時我想起了剛學的promise.race方法,也許這個方法可以幫助我表達我的這一決策需求.

function

borrowmoneyfromothers() );

}複製**

我用timeout 模擬一下他們給我答覆的,**如下:

// 嘗試找張三借

function

tryborrowmoneyfromzhangshan(): promise

, 100);

});}// 嘗試找李四借

function

tryborrowmoneyfromlisi(): promise

, 50);

});}// 嘗試找王五借

function

tryborrowmoneyfromwangwu(): promise

, 500);

});}複製**

結果執行之後,控制台輸出的是:

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

看來promise.race適用用來模擬搶答,而不是選擇最優解。 比如多人搶答乙個問題,第乙個搶答之後不論他回答的是否是正確,這個題都過了。

不過沒關係。也許我可以自己寫乙個來叫做promiseone的函式來實現這個功能。**如下:

/**

* 當其中乙個 promise 兌現時,返回的 promise 即被兌現

* @param promises promise的陣列

*/function

promiseone

(promises: promise

): promise

});

});});

}複製**

正當我寫完了上面的**,他們三個給我回話了,說是現在手上也沒有那麼多錢,但是可以給我借100. 於是我現在需要處理這樣的事情,就是當他們三個人把錢都轉給我之後我再轉給家裡。 當他們三個都兌換借我100塊錢的承諾時,可以用promise.all來表示,**如下:

function

borrowmoneyfromothers() )

.catch(reasons => );

}複製**

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

function

buylottery(bet: number

): promise

, 100);

});}function

borrowmoneyfromothers() );

}).catch(reasons => );

}複製**

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

function

betworldcup() , 100);

});})

.then(ret => )

.then(ret => , 92);

});})

.then(ret => );

}複製**

我想,如果第一場投失敗了,應該再給自己一次機會。於是將**修改如下:

function

betworldcup() , 100);

});})

.then(

ret => ,

reason =>

).then(ret => , 92);

});})

.then(ret => )

.then(ret => )

.catch(reason => );

}複製**

此時如下執行上面的函式會得到如下輸出:

第一次投注失敗,再給一次機會好不好?, 失敗原因:  莊家跑跑路了

現在收益加本金共有: 360

出錯了:

error: 不要再買了

複製**

然而,幻想結束之後,我依然得苦苦思考怎麼樣籌錢。

乙個悲傷的故事

昨天她和我說她和她男友分了,我說不挺好的麼,你都準備回武漢了,她說他家為了多分一套房子逼婚,僅僅只是想讓兩個人拿證,沒談操辦婚事之類的事情,也沒過問她家的意見,結果就是兩人分了,因為她覺得他們家沒有誠意,隨隨便便就像讓她和他結婚,另一方面他也沒工作,目前看很不靠譜沒有安全感,兩個人自此鬧矛盾以後他就...

用 Promise 實現乙個訊息佇列

在此篇部落格中,我們的需求如下 有乙個訊息排程器去操作傳送來訊息 但處理訊息花費的事件是不確定的,有多有少 訊息是不斷傳送過來的 這個時候就會出現一種情況 前一條訊息還未執行結束,後一條訊息就被傳送過來了 如果這個時候要求後一條訊息必須在前一條執行完才開始執行,該如何實現?sync function...

手寫乙個Promise

js物件導向 在js中一切皆物件,但js並不是一種真正的物件導向 oop 的語言,因為它缺少類 class 的概念。雖然es6引入了class和extends,使我們能夠輕易地實現類和繼承。但js並不存在真實的類,js的類是通過函式以及原型鏈機制模擬的,本小節的就來 如何在es5環境下利用函式和原型...