使用 Promises 执行流程,将一个函数的输出作为下一个函数的输入传递
Using Promises to execute flow, passing the output of one function as input of the next function
我正在编写具有以下流程的软件:
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 对象从一个 thenable 传递到下一个 thenable。如果您只是传递一个值,它将 return 该值。
When a value is simply returned from within a then handler, it will effectively return Promise.resolve().
2018 年 3 月 14 日更新:此答案不正确。请参考@Bergi
的评论
是的!这完全没问题,对于某些人来说,这是通过 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 => {});
我正在编写具有以下流程的软件:
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 对象从一个 thenable 传递到下一个 thenable。如果您只是传递一个值,它将 return 该值。
When a value is simply returned from within a then handler, it will effectively return Promise.resolve().
2018 年 3 月 14 日更新:此答案不正确。请参考@Bergi
的评论是的!这完全没问题,对于某些人来说,这是通过 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 => {});