从 javascript promise (expressjs + neDB) 中提取函数

Posted

技术标签:

【中文标题】从 javascript promise (expressjs + neDB) 中提取函数【英文标题】:Extract function from javascript promise (expressjs + neDB) 【发布时间】:2020-09-10 13:02:42 【问题描述】:

以下代码正在运行并从我的 neDB-promises 中检索所有用户:

const getUsers = (res) => 
  db.find()
      .sort( name: 1 )
      .exec()
      .then(
          (content) => 
              res.status(200).json(content);
          ,
          (err) => 
              res.status(400).json(err);
          
      );
;

我正在尝试做的事情:优化这段代码以避免将来重复 CRUD 函数,如下所示:

...
.then(successFunctionCall, failureFunctionCall)
...

我曾考虑创建一个名为 successFunctionCall/failureFunctionCall 的单独模块,但我需要在其中调用 res 来设置响应 JSON 和状态码。这是实现这一目标的更好方法吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以curry 函数。当您将它们用作处理程序时,传递res,并获得一个等待contenterr 的新函数:

const successFunctionCall = res => content => 
  res.status(200).json(content);

const failureFunctionCall = res => err => 
  res.status(400).json(err);

const getUsers = (res) => 
  db.find()
      .sort( name: 1 )
      .exec()
      .then(
        successFunctionCall(res),
        failureFunctionCall(res)
      );
;

【讨论】:

【参考方案2】:

为了避免 CRUD 函数的重复,您的关注点可能会有所不同。以下是我的意思的基本概念。

const usersDb =  // your users db instance here

const findAllSortedBy = db => (...args) => db.find().sort(...args).exec()

const findAllUsersSortedBy = findAllSortedBy(usersDb)

const success = res => content => res.status(200).json(content)

const failure = res => err => res.status(400).json(err)

const getUsers = res => 
  findAllUsersSortedBy( name: 1 )
    .then(success(res))
    .catch(failure(res))

这里是 getUsers 在快速路由处理程序的上下文中

const getUsers = (req, res) => 
  findAllUsersSortedBy( name: 1 )
    .then(success(res))
    .catch(failure(res))


router.get('/users', getUsers)

【讨论】:

以上是关于从 javascript promise (expressjs + neDB) 中提取函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript异步编年史,从“纯回调”到Promise

JavaScript中的Promise

如何同步确定JavaScript Promise的状态?

异步JavaScript的演化史:从回调到Promise再到Async/Await

带有 JavaScript 函数的 Async-Await 或 Promises [关闭]

译异步JavaScript的演变史:从回调到Promises再到Async/Await