Tengo esta función, que básicamente es mapear parámetros de solicitud y parámetros de consulta a una declaración SQL:
function selectSingleResult(params, { order, limit, offset, fields, runset_id, txOffset, txFactor }) { const transformer = R.when(R.equals('values'), R.compose(knex.raw.bind(knex), applyConversion({ txOffset, txFactor }))) const newFields = R.map(transformer , fields); knex('myTable').select(...newFields) // etc... Idealmente, me gustaría poder definir el transformer fuera de la función para que la función pueda convertirse en:
const mapFields = R.map(transformer); function selectSingleResult(params, { order, limit, offset, fields, runset_id, txOffset, txFactor }) { knex('myTable').select(...mapFields(fields)) // etc... El problema es que la función applyConversion necesita argumentos dados a selectSingleResult .
Este es un problema común que tengo con las funciones de transformación para map . A menudo requieren parámetros distintos de los valores que se asignan. En tales casos, ¿cómo puedo escribir sin puntos, o al menos con un estilo más comprobable y no terminar anidando tanto las funciones?
Se siente como si estuviera tratando de ir sin puntos en el código donde no tiene mucho sentido. Pero hay una noción contrastante de desestructurar un gran conjunto de campos del segundo parámetro que no parece necesario, por lo que parece confuso. (En realidad, podría ser necesario: tal vez esté usando order , limit , offset y runset_id en el resto de su función principal).
Creo que puede lograr casi lo que está pidiendo simplemente introduciendo una capa más de llamadas, con algo como esto:
const transformer = (query) => R .when (R .equals ('values'), field => knex .raw (applyConversion (query) (field))) const mapFields = R.pipe (transformer, map) const selectSingleResult = (params, query) => { knex ('myTable') .select (... mapFields (query) (query .fields)) // etc... } Nombro el segundo parámetro para su query de función principal; es una conjetura, y si eso es confuso, reemplace todas las instancias de query con foo o con algo significativo para usted.
Tenga en cuenta que mapFields también podría escribirse como const mapFields = (query) => R.map (transformer (query)) , pero la versión anterior parece más simple. También tenga en cuenta que simplifiqué un poco el transformer . Simplemente no veo ninguna razón para tratar de ir sin puntos, cuando no puedes llegar hasta allí. Y tratar de mezclar código sin puntos con construcciones OO como knex .raw parece confundir las cosas.
Si leo el código correctamente, también podríamos reescribir el transformer de esta manera:
const transformer = (query) => (field) => field == 'values' ? knex .raw (applyConversion (query) ('values')) : fieldpero no puedo decidir si eso es una mejora o no.