使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入传递
Posted
技术标签:
【中文标题】使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入传递【英文标题】:Using Promises to execute flow, passing the output of one function as input of the next function 【发布时间】: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)
【参考方案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)); )
简单以上是关于使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入传递的主要内容,如果未能解决你的问题,请参考以下文章
使用 promises 索引映射 Promise.all 输出
javascript accumulate():按顺序执行promises或promise-returns函数数组,并使用给定的累加器减少结果