У меня есть этот код, который создает 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()
Как мне начать с этого?
UPDATE: Нижеприведенные решения довольно хороши, но я хотел бы понять, как функциональные программисты используют ADT (Алгебраические типы данных) с Monads для решения этой проблемы. Идея состоит в том, чтобы запустить chain
функций, а затем fold
, чтобы вернуть значение, которое я хочу
Вы уверены, что _want_ сделать что-то вроде этого? 'base' на самом деле не является параметром' params'. Ни одно из них не подчинено никому другому. Все они равные участники в создании конечной точки. Если вы хотите показать имена компонентов в вызове, идиома JS - это нечто вроде «endpoint ({protocol, base, params, query)), вызываемое с использованием сокращенной записи объекта. –
hmm..you're right. Вы говорите, что я должен достичь функциональной композиции только тогда, когда параметры совпадают? Это может быть неправильное приложение? –
@RayToal, что я хочу сделать, это, по сути, цепочка вызовов функций, так что значение endvalue одной функции передается другому, и необходимость проверки нулевых значений удаляется. –