【问题标题】:Using Promises to execute flow, passing the output of one function as input of the next function使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入传递
【发布时间】:2018-03-14 05:35:27
【问题描述】:

我正在编写一个具有以下流程的软件:

Promise.resolve(updateMongoStatus)
  .then(unzipFilesFromS3)
  .then(phase4) //example
  .then(phase5) //example
  .then(processSomething)
  .catch(saveErrorToMongo)

我想知道是否可以将数据从第一个函数传递到最后一个函数,例如:

function updateMongoStatus() {
  // do something here that updates Mongo and get status of some document

  return { status }
}

function unzipFilesFromS3({ status }) {
  // do something here to unzip files from s3
  return { status, files }
}

function phase4({ status, files }) {
  // etc
}

直到processSomething 最终被调用:

function processSomething({ parameterFromOutputOfUpdateMongoStatus, parameterFromPhase4, parameterFromPhase5 }) {
  // Do something here
}

这样好吗?像这样传递数据?

谢谢。

【问题讨论】:

  • 是的,这完全没问题,虽然可能有simpler solutions to do that
  • 哇,这真是完美的贝尔吉!欧姆
  • 只是一个提示,Promise.resolve(updateMongoStatus) 不会返回 Promise<{ status }> 而是 Promise<Function>。你的意思可能是Promise.resolve().then(updateMongoStatus)

标签: javascript node.js promise execution


【解决方案1】:

是的!这完全没问题,对于某些人来说,这是通过 Promise 链传递数据的首选方式(因为它不涉及 Promise 块范围之外的任何全局变量/变量)。

在您的情况下,由于您希望在最后一个承诺中使用 phase4、phase5 和 mongo 状态,您可以这样做:

Promise
  .resolve(mongoStatus)
  .then((mongoResult) => { 
    return unzipFilesFromS3().then(s3Result => {
      return [s3Result, mongoResult];
    });
})
.then(([ s3Result, mongoResult ]) => {

  return Promise.all([
    mongoResult, 
    s3Result,
    phase4(mongoResult, s3Result) 
  ]);
}) 
// repeat with phase5
.then(([ mongoResult, s3Result, phase4Result /* phase5, etc */ ]) => {
  // etc
})
.catch(err => {});

【讨论】:

    【解决方案2】:

    不,您需要将 promise 对象从 thenable 传递到下一个 thenable。如果你只是传递一个值,它就会返回这个值。

    当从 then 处理程序中简单地返回一个值时,它将有效地返回 Promise.resolve()。

    Promise.prototype.then()

    2018 年 3 月 14 日更新:此答案不正确。请参考@Bergi 的评论

    【讨论】:

    • 你自相矛盾。首先你说需要返回一个promise,然后你说返回一个值也可以?
    • 也许我对链接承诺的理解是错误的。但是,如果您没有将承诺传递给下一个 thenable,那么链接多个 thenable 的目的是什么?
    • 通常,简单。当然,多个相互链接的同步回调可以合并为一个回调,但如果这些函数已经作为构建块存在,您可能只需多次调用then。示例.then(JSON.parse).then(printData).then(function(result) { return printData(JSON.parse(result)); }) 简单
    猜你喜欢
    • 2019-05-20
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2022-01-04
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多