使用 sleep() 延遲一段時間再繼續執行
很多平台都有 sleep()
,讓我們可以等待一段時間再繼續執行,這常見需求在 ECMAScript 該如何實現呢 ?
失くすものさえない今が強くなるチャンスよ
很多平台都有 sleep()
,讓我們可以等待一段時間再繼續執行,這常見需求在 ECMAScript 該如何實現呢 ?
Promise.allSettled()
雖然好用,唯其以 Static Method 設計,且也不適合 Function Pipeline,Wink-fp 提供 Function 化的 allSettled()
。
Promise.all()
對處理 Promise Array 非常好用,讓我們不必使用 Imperative 的 for await of
,但可惜 Promise.all()
不適合 Pipeline,Wink-fp 特別提供 all()
取代 Promise.all()
。
當 Knex 使用 count()
或 sum()
時,回傳仍是 Array,且 count()
或 sum()
的值是在特定 Property 內,可使用 tug()
可輕易取出其值。
ECMAScript 2015 提供了新的 Array.prototype.fill()
,唯其以 Method Chianing 形式提供,且有 Side Effect 問題,Wink-fp 特別提供 Function 化的 fill()
解決此問題。
JSON.parse()
負責將 JSON String 轉成 Object,唯其以 Static Method 呈現,特別將其 Function 化適合 Pipeline。
ECMAScript 2015 引進 Promise,2017 引進 Async Await,至此 ECMAScript 才有 Async Function 概念,該如何將原本 Sync Function 轉成 Async Function 呢 ?
若想一次寫入多個 Property 且 Immutable,ECMAScript 的 Property Shorthand 與 Ramda 的 assoc()
與 set()
都有其極限,Wink-fp 的 mix()
可讓我們一次滿足兩個願望。
JSON.stringify()
負責將 Object 轉成 JSON String,唯其以 Static Method 呈現,特別將其 Function 化適合 Pipeline。
zipWith()
只能將 2 個 Array 合併,若要將 n 個 Array 合併呢 ? Ramda 並沒有提供適當 Function,我們可自行組合出 zipAllWith()
。
判斷基偶數也是常用功能,也能使用 Function Composition 實現。
若我們想從 Array 得到幾個特定 Index 的 Element 時,Ramda 並沒有提供此 Function,但我們可自行組合。
實務上若由 User 傳入 Object 欲與 Default Object 合併,但 User 可能多傳了一些 Property,而我們只想取用 Default Object 有的 Property,多的 Property 忽略不計,Object.assign()
或 Ramda 的 merge()
會將多餘的 Property 也 merge 進來,因此不符合需求。
Ramda 的 range()
只提供 begin
與 end
兩個 Argument,但大部分 Library 還提供了第三個 Argument:step
,我們也可以自行實作之。
若我們想指定特定長度建立 Array,且給定初始值,隨後會自動建立 Sequence,在 ECMAScript 並沒有內建 Function,但我們可以自行建立 generate()
完成需求。
Ramda 有提供 anyPass()
與 allPass()
,卻沒有提供 nonePass()
,藉由 Function Composition 我們也可以自行組合出 nonePass()
。
Ramda 提供 isNil()
,可同時判斷 undefined
或 null
,但並沒有提供 isNotNil()
,但我們可自行組合。
若我們想指定特定長度建立 Array,且初始值都相同,在 ECMAScript 並沒有內建 Function,但我們可以自行建立 create()
完成需求。
concat()
能將兩個 Array 合併成單一 Array,若是 N 個 Array 呢 ? Ramda 沒有提供此 Function,但我們能自行組合出 concatAll()
。
在 Elixir 的部落格發現一個很帥的 wrap()
Function,除了可以將 Array 攤平,還可以讓 null
優雅消失,特別將其 Porting 到 Wink-fp。
若我們想延遲一段時間才產生 Promise,標準做法是 Promise Constructor 配上 Callback-based 的 setTimeout()
,事實上搭配 Promise-based 的 sleep()
之後, 能用更 Functional 方法實現。
由於 Asynchronous 回傳結果時間不確定,Wink-fp 的 timeout()
能產生指定時間的 rejected promise,若實際 Promise 晚於 Timeout Promise 則放棄,改回傳 rejected promise。
在 ECMAScript 5 以 Callback 實現 Asynchronous,如 Node 所提供的 Function 就是 Callback-Based,我們可實作一個 Higher Order Function 專門將 Callback-Based Function 轉成 ECMAScript 2015 的 Promise-Based Function。
ECMAScript 2018 的 finally()
與 try catch finally
的確可處理 Fulfilled Promise 與 Rejected Promise 共用邏輯,但可惜還不夠 Functional,透過 Wink-fp 的 eventually()
可使 Promise Chain 也能 Function Composition。
由於 ECMAScript 是動態語言,實務上有時必須根據 Property 是否存在而做不同的處理,透過 Wink-fp 的 hasProp()
可判斷 Object 的 Property 是否存在。