那天我正在學習 promise,突然家裡打**過來說,家裡蓋房子要錢。我工作這麼多年了,從事著別人眼中高薪工作,於是滿口答應下來。但是由於我並沒有錢,於是我跟家裡說,等過幾天我再打錢過去。我也好乘著這幾天想想辦法。
首先我找到我的同學李雷,他現在乙個部門經理了,我想應該他應該有錢。我跟他說明了借錢的意向,李雷二話不說就答應借我300,不過同時表示要回家跟老婆商量商量,我說好。此時我想起來答應或者說承諾的英文單詞就是promise
。承諾的結果是錢,錢是數值(number 型別)。於是我想把我要借錢的這一行為寫成乙個typescript
函式如下:
此時,我在想李雷老婆會答應給我借300塊嗎?我不確定,就像薛丁格的貓。借還是不借,這是乙個問題。然後我發現這也可以寫成乙個函式。借或者不借用布林值來表示 (boolean 型別)。函式如下:// 向李雷借錢,李雷丟給我乙個承諾
function
borrowmoneyfromlilei(): promise
);}複製**
如果李雷借我錢了,我就轉錢給家裡,沒有,我應該要再去找別人借了。可以用下面的函式描述我此時的處境。// 李雷的老婆是否會答應給我借錢?
function
willlileiwifelendmemoeny(): promise
);}複製**
找其他人借,我能想到就(張三,李四,五五)這三個人了,其他的朋友很少聯絡,突然說借錢也不好。於是我嘗試向他們借錢。用**表示是這樣子的:function
transfermoneytohome(money: number
) function
mysituation()).catch((reason) => )
}複製**
由於藉著錢之後都是向家裡轉錢,所以上面的**應該簡化一下。簡化後如下:function
borrowmoneyfromothers() )
.catch(reason => )
.catch(reason2 => )
.catch(reason => );
});});
}複製**
在上面的思路中,我是乙個乙個找他們借錢的,乙個借不著再找另乙個。我為什麼不同時找他們借呢?誰借我了,我就轉錢給家裡。此時我想起了剛學的function
borrowmoneyfromothers() );
});});
}複製**
promise.race
方法,也許這個方法可以幫助我表達我的這一決策需求.
我用timeout 模擬一下他們給我答覆的,**如下:function
borrowmoneyfromothers() );
}複製**
結果執行之後,控制台輸出的是:// 嘗試找張三借
function
tryborrowmoneyfromzhangshan(): promise
, 100);
});}// 嘗試找李四借
function
tryborrowmoneyfromlisi(): promise
, 50);
});}// 嘗試找王五借
function
tryborrowmoneyfromwangwu(): promise
, 500);
});}複製**
沒乙個人願意給我借錢,他們理由是: 對不起我也沒錢看來
promise.race
適用用來模擬搶答,而不是選擇最優解。 比如多人搶答乙個問題,第乙個搶答之後不論他回答的是否是正確,這個題都過了。
不過沒關係。也許我可以自己寫乙個來叫做promiseone
的函式來實現這個功能。**如下:
正當我寫完了上面的**,他們三個給我回話了,說是現在手上也沒有那麼多錢,但是可以給我借100. 於是我現在需要處理這樣的事情,就是當他們三個人把錢都轉給我之後我再轉給家裡。 當他們三個都兌換借我100塊錢的承諾時,可以用/**
* 當其中乙個 promise 兌現時,返回的 promise 即被兌現
* @param promises promise的陣列
*/function
promiseone
(promises: promise
): promise
});
});});
}複製**
promise.all
來表示,**如下:
現在有三個人願意給我借錢了,嗯,也就是說我借到了 300 塊。然而這錢用來建房還是杯水車薪。所以我還得想辦法。我想我要不要試試用這300塊來買一下彩票。如果中了,說不定這事就成了。function
borrowmoneyfromothers() )
.catch(reasons => );
}複製**
我知道很大概率我是買不中的,最近世界盃開賽了,我幻想著壓注世界盃,而且世界盃場次多,一天好幾場,一場買中的盈利還可以投入到下一場。我把我的幻想寫成**,大概就是下面這樣。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環境下利用函式和原型...