【问题标题】:NodeJS combine chaining sync and async functions with thenNodeJS 将链式同步和异步函数与 then 结合起来
【发布时间】:2017-01-17 09:33:46
【问题描述】:

我有一个 main 函数,用于执行特定查询并解析响应。该函数的第一步是验证赋予该函数的参数。然后我将生成查询,签名然后发送。最后,我将处理响应。

为了发送查询,我想使用承诺模式。我想要的是主函数会返回一个承诺。问题是,大多数函数都是同步的而不是异步的,所以我不应该使用 Promise。我想要的是这样的:

return this.validateQueryAttributes(attributes)
  .then(generateQuery)
  .then(signQuery)
  .then(sendQuery)
  .then(handleResponse);

问题是,第一个函数没有返回承诺。所以我不能用 then 将它与其他函数链接起来,因为 then 模式期望得到一个承诺。另外,我有一个上一级的 .catch 函数,我想用它来捕获我正在调用的任何函数中可能发生的错误情况。如果我不将第一个函数与其余函数链接,那么第一个函数中发生的错误将不会被捕获?

【问题讨论】:

  • 是的,但如果函数本身是同步的,则永远不应该返回承诺。你应该只对异步函数使用 Promise。
  • 在这种情况下这是最佳做法吗?如果您认为是,请将其发布为答案。以及如何制作异步包装器:)

标签: node.js asynchronous promise es6-promise


【解决方案1】:

您可以使用Promise.resolve() 启动一个承诺链,然后使用同步(可能还有抛出)函数作为then 处理程序:

return Promise.resolve(attributes)
  .then(this.validateQueryAttributes) // you might need .bind(this)
  .then(generateQuery)
  .then(signQuery)
  .then(sendQuery)
  .then(handleResponse);

或者,如果您使用的是 Bluebird 等库,也可以使用 Promise.tryPromise.method 来捕获同步异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多