當 Knex 使用 count()
或 sum()
時,回傳仍是 Array,且 count()
或 sum()
的值是在特定 Property 內,可使用 tug()
可輕易取出其值。
Version
macOS Catalina 10.15.3
WebStorm 2019.3.3
MySQL 8.0.18
Knex 0.20.2
Wink-fp 1.20.66
Knex
mySQL('books')
.sum({ sum: 'price' })
.then(x => x[0].sum)
.then(log)
使用 Knex 的 sum()
時,由於回傳 promise,需在 then()
以 x => x[0].sum
才能取得其值。
Ramda
import { pluck, head } from 'ramda'
import { log } from 'wink-fp'
mySQL('books')
.sum({ sum: 'price' })
.then(pluck('sum'))
.then(head)
.then(log)
若要使 then()
也 point-free,需在 then()
使用 pluck()
與 head()
兩個 function。
tug()
import { useWith, compose, head, pluck, identity } from 'ramda'
import { log } from 'wink-fp'
let tug = useWith(
compose(head, pluck), [identity, identity]
)
mySQL('books')
.sum({ sum: 'price' })
.then(tug('sum'))
.then(log)
為了要使 tug()
的 data 放在最後一個 argument,使用 useWith()
與 identity()
配合,如此可以 tug()
取代 pluck()
與 head()
。
Wink-fp
import { tug, log } from 'wink-fp'
mySQL('books')
.sum({ sum: 'price' })
.then(tug('sum'))
.then(log)
Wink-fp 已經提供 tug()
可直接使用。
tug()
String -> [a] -> *
取得 Array 第一個 element 的特定 property
String
:指定要回傳的 property 名稱
[a]
:data 為 array
*
:回傳該 property
Conclusion
- 對於 Knex 的
count()
、sum()
這類 function,tug()
特別好用,讓我們不用組合pluck()
與head()