我有這樣的代碼,正在建設一個URL端點採取不同的參數:如何在javascript中使用組合函數鏈接?
const query = (obj) => {
let starter = 'query='
let queryToString = JSON.stringify(obj)
return `${starter}${queryToString}`
}
const params = (str) => `${str}`
const endpoint = (protocol, base, params, query) => {
if (!params && !query) return `${base}`
if (!params) return `${base}${query}`
return `${protocol}${base}?${params}&${query}`
}
const baseUrl = 'api.content.io'
const protocol = (secure = true) => secure ? 'https://' : 'http://'
let result = endpoint(protocol(), baseUrl, params('limit=5&order=desc'),
query({
field: 'title',
include: 'brands'
}));
console.log(result)
這將構建一個字符串,如:
https: //api.content.io?limit=5&order=desc&query={"field":"title","include":"brands"}
是否有可能重構這個代碼這樣endpoint
函數中的條件可以被刪除,正確的連接字符串被應用和整個事情鏈接到一個功能調用如
Endpoint.chain(protocol(p)).chain(base(b)).chain(params(p)).chain(query(q)).build()
我該如何開始這樣做?
更新:下面的解決方案是相當不錯的,但我想了解功能程序員如何使用Monad ADT(代數數據類型)來解決此問題。這個想法是運行一個chain
的功能,然後fold
找回我想要的值
你確定你_want_做這樣的事? 'base'實際上不是'params'的參數。這些都不屬於任何其他。他們在製作端點方面都是平等的參與者。如果您希望在調用中顯示組件的名稱,則JS成語就像使用對象速記符號調用的「endpoint({protocol,base,params,query})」。 –
嗯..你是對的。你是說我只有在參數匹配時才能達到功能組合?這可能是一個錯誤的應用程序? –
@RayToal我想要做的實際上是鏈接函數調用我猜 - 以便一個函數的結束值被傳遞到另一個,並檢查空值的必要性被刪除 –