今天看到一個好玩的東西,它就是MayBe函子,它能使我們能夠以函數式的方式處理代碼中的錯誤,寫條博客記錄一下順便分享給大家哈!
MayBe函數定義
const MayBe = function (val) {
this.value = val;
}
MayBe.of = function (val) {
return new MayBe(val);
}
MayBe是一個能持有數據的函子,它將實現一個map函數
MayBe.prototype.isNothing = function() {
return (this.value === null || this.value === undefined);
};
MayBe.prototype.map = function(fn) {
return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this.value));
};
MayBe 的map 在應用傳入的函數之前先使用 isNothing 函數檢查容器中的值是否爲 null 或 undefined :
(this.value === null || this.value === undefined);
如果結果是true,MayBe將返回null,否則返回後面的函數結果
簡單實例
我們簡單的創建一個 MayBe :
MayBe.of("abcd").map((x) => x.toUpperCase())
結果一目瞭然,就是:
MayBe { value: 'ABCD' }
如果我們把 abcd 改成 null 會怎樣呢:
MayBe.of(null).map((x) => x.toUpperCase())
結果是:
MayBe { value: null }
代碼並沒有崩潰,因爲我們已經把值封裝到了一個安全容器 MayBe 中,它不會拋出任何錯誤,只是返回了 MayBe.of(null)
注意
- 即使給 map 傳入返回 null 或 undefined 的函數,MayBe 也可以處理
- 所有的 map 函數都會被調用,無論它是否接收到 null 或 undefined
看一個例子:
MayBe.of("word")
.map( () => undefined )
.map( (x) => "hello" + x )
運行上面的代碼將會得到結果:
MayBe { value: null }
這裏的重點是,即使第一個 map 函數返回了 undefined,第二個 map 仍然會被調用!它也會返回 undefined ,因爲前一個 map 返回了 null/undefined ,只是不應用傳入的參數!
以上就是今天分享給大家的內容了,不要忘了點贊呀!晚安啦!