javascript - 使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入

标签 javascript node.js promise execution

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

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
}

这样可以吗?像这样传递数据?

谢谢。

最佳答案

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

就您而言,由于您希望在最后一个 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 => {});

关于javascript - 使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49270355/

相关文章:

node.js - 引用错误: clientSecret is not defined in stripe

javascript - 用 promises 替换 TestCafe async/await

javascript - 将子级中的 v-model 链接到父级值 vue js

javascript - Rails 4 - 如何安装 "jquery-ui"?

Javascript 字符串替换最后一次出现

javascript - 为什么我得到 "Uncaught ReferenceError: require is not defined"?

javascript - JS中Base64转图片文件

angularjs - 在基于 REST 的应用程序中,$resource AngularJS 客户端中的 PUT/更新操作失败( Mongoose 插入/更新问题)。

javascript - 将分配替换为延迟分配

javascript - 在链式 Promise 中,为什么第二个 Promise 在第一个 Promise 之前执行?