MayBe函子竟有如此妙用?快get起來!

今天看到一個好玩的東西,它就是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 ,只是不應用傳入的參數!

以上就是今天分享給大家的內容了,不要忘了點贊呀!晚安啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章