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

时间:2018-03-14 05:35:28

标签: 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
}

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

谢谢。

2 个答案:

答案 0 :(得分:3)

是的!这是完全可以的,对于某些人来说,这是通过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 => {});

答案 1 :(得分:-1)

不,您需要将一个promise对象从一个可能的对象传递给下一个。如果您只是传递一个值,它将返回值。

  

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

Promise.prototype.then()

自14/03/2018起更新:此答案不正确。请参阅@Bergi的评论