如何優雅的鏈式取值之 MayBe 函子

2021-09-27 09:55:34 字數 2031 閱讀 9798

本文基於 如何優雅地鏈式取值

從 如何優雅地鏈式取值 這篇文章的描述中,可以看出處理巢狀層級特別深的**經常會由於資料的原因而出一些錯。例如下面呢這種資料

const res = ,

anthergoods:]}}

}

假設我們想對 onegoods 裡面的 lists 中的商品的 name 進行操作,我們可以這麼寫

res.data.onegoods.lists[0].name.touppercase()
那麼問題就來了,假設 name 不存在呢,這就會報錯,導致程式終止。例如

res.data.anthergoods.lists[0].name.touppercase()

// cannot read property 'touppercase' of undefined

或者再極端一點,lists 中沒有那一項

res.data.anthergoods.lists[1].name.touppercase()

// cannot read property 'name' of undefined

有哪些方式那篇文章已經說的差不多了,但是有一種沒有提到,就是使用函式式程式設計的 maybe 函子。來看看用 maybe 函子怎麼做吧。

其實在 函式式程式設計之函子 中已經說過了,這裡再簡單介紹一下吧。

const maybe = function(val)

maybe.of = function(val)

maybe.prototype.isnothing = function()

maybe.prototype.map = function(fn)

首先函子是乙個實現了 map 方法的普通物件。maybe 能夠儲存任何傳進來的值。maybe.of 是乙個靜態方法,能夠返回乙個新的 maybe 例項。然後它實現了 map 方法,在執行 map 方法時會呼叫 isnothing 方法進行判斷,如果為 null 或者 undefined 就會返回乙個值為 null 的物件。

那麼用這個怎麼處理之前的鏈式呼叫呢。

maybe.of(res).map(res=>res.data)

.map(data=>data.onegoods)

.map(onegoods=>onegoods.lists)

.map(lists=>lists[0])

.map(list=>list.name)

.map(name=>name.touppercase())

maybe.of(res).map(res=>res.data)

.map(data=>data.anthergoods)

.map(onegoods=>onegoods.lists)

.map(lists=>lists[0]).map(list=>list.name)

.map(name=>name.touppercase())

// maybe

maybe.of(res).map(res=>res.data)

.map(data=>data.anthergoods)

.map(onegoods=>onegoods.lists)

.map(lists=>lists[1])

.map(list=>list.name)

.map(name=>name.touppercase())

// maybe

雖然看起來並不簡單,其實邏輯比較簡單,就是**多了一點。但是這種鏈式呼叫的話類似於 promise,所以使用起來特別舒服,而且它把對於錯誤的處理抽象了出來,讓我們無需關係這部分。所以也是一種很好的解決方案。

總歸也找到了函式式程式設計的一種應用場景,不同的方案有不同的好處,多了解一些東西總能拓寬自己的思路吧。而且那篇文章沒有提到可能是因為沒有想到 maybe 函子的應用場景,或者不太了解函式式程式設計,也算是對那篇文章的乙個補充吧。希望能引起大家學習函式式程式設計的興趣?

如何優雅的送禮?

送禮的尺度要以法律規定和公司制度為紅線,在職場上,肯定不能送重禮,否則可能成為商業賄賂。很多國際化的公司都有明確的送禮和收禮規定,不能超過幾百元。牢記這一條,你就會發現有創意是多麼的重要,因為你的預算空間實在很小。送禮這件事,從策劃選禮物到對方接收到禮物是乙個操作過程,最重要的是送禮時刻。其實對於有...

如何優雅的使用「看板」?

你需要通過看板達到什麼目的 看板三原則 1.使工作視覺化,給每人乙個專案目前的big picture。2.減少並行工作。乙個user story的生命週期被切分成較小的塊,每個人應該keep在其中一塊。3.優化工作流程。在實踐中不斷迭代看板的流程,增減某些階段,或調整從乙個階段跳轉到下乙個階段的邊界...

如何優雅的使用rem

移動端css做布局的時候,如何選擇px em rem這幾個單位呢?很多初做移動端的童鞋們,不知道如何用px em 還是用rem做移動端的布局,那就舉例說一下 如果使用 作為單位的話,在iphone4上多少會有些布局錯位,那用rem就解決了這個難題。document.documentelement.s...