javascript - 如何使用 Ramda.js 重构这个组合函数?

标签 javascript node.js functional-programming ramda.js

我正在使用ramdadata.task编写一个小实用程序,它从目录中读取图像文件并输出其大小。我让它像这样工作:

const getImagePath = assetsPath => item => `${assetsPath}${item}`

function readImages(path) {
  return new Task(function(reject, resolve) {
    fs.readdir(path, (err, images) => {
      if (err) reject(err)
      else resolve(images)
    })
  })
}

const withPath = path => task => {
  return task.map(function(images) {
    return images.map(getImagePath(path))
  })
}

function getSize(task) {
  return task.map(function(images) {
    return images.map(sizeOf)
  })
}

const getImageSize = dirPath => compose(getSize, withPath(dirPath), readImages)

问题出在 withPath 函数上,该函数将正确的图像路径添加到图像文件名中,但强制我的 api 传入directoryName 两次:一次用于读取文件,第二次用于读取小路。这意味着我必须像这样调用 getImageSize 函数:

const portfolioPath = `${__dirname}/assets/`

getImageSize(portfolioPath)(portfolioPath).fork(
  function(error) {
    throw error
  },
  function(data) {
    console.log(data)
  }
)

有没有办法将dirname作为参数仅传递一次?我希望 api 像这样工作:

getImageSize(portfolioPath).fork(
  function(error) {
    throw error
  },
  function(data) {
    console.log(data)
  }
)

最佳答案

您不应该像这样手动构建路径

Node 更好的 API 之一是 Path module – 我建议您将 readImages 包装器设为通用 readdir 包装器,并解析 path.resolve 数组'd 文件路径

const readdir = dir =>
  new Task ((reject, resolve) =>
    fs.readdir (dir, (err, files) =>
      err
        ? reject (err)
        : resolve (files.map (f => path.resolve (dir, f)))


const getImagesSizes = dir =>
  readdir (dir) .map (R.map (sizeOf))

仅仅为了返回一个 Task 来包装 Node 连续传递风格的 API 会很麻烦,不是吗?

const taskify = f => (...args) =>
  Task ((reject, resolve) =>
    f (...args, (err, x) =>
      err ? reject (err) : resolve (x)))

const readdir = (dir, ...args) =>
  taskify (fs.readdir) (dir, ...args)
    .map (R.map (f => path.resolve (dir, f)))

const getImagesSizes = dir =>
  readdir (dir) .map (R.map (sizeOf))

您可能还应该注意归档目录的文件路径 - 除非您的sizeOf实现可以处理该问题

关于javascript - 如何使用 Ramda.js 重构这个组合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46845817/

相关文章:

javascript - JQuery 问题中的日期选择器和克隆功能?

node.js - 如何在将 Json 转换为 CSV 时在 json2csv 库中提供自定义字段

java - RxJava : merge() changes the order of the emitted items?

functional-programming - 评估期间堆栈溢出(循环递归?)。奥卡米尔

Javascript 在其他函数完成后执行函数

javascript - 从 JavaScript 中找出博客访问者的唯一 ID(他们的 Google 帐户、GMail 等)

javascript - MVC 中多种模式下的 Select2 仅生成第一个值

node.js async.series 不工作

node.js - DynamoDB 应用程序架构

java - 谷歌 Guava : Supported way to get elements of a collection that comply with a given predicate?