Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用承诺执行流,将一个函数的输出作为下一个函数的输入传递_Javascript_Node.js_Promise_Execution - Fatal编程技术网

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

Javascript 使用承诺执行流,将一个函数的输出作为下一个函数的输入传递,javascript,node.js,promise,execution,Javascript,Node.js,Promise,Execution,我正在编写一个具有以下流程的软件: Promise.resolve(updateMongoStatus) .then(unzipFilesFromS3) .then(phase4) //example .then(phase5) //example .then(processSomething) .catch(saveErrorToMongo) 我想知道是否可以将数据从第一个函数传递到最后一个函数,例如: function updateMongoStatus() { /

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

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
}
这样行吗?这样传递数据


谢谢。

否,您需要将承诺对象从一个表传递到下一个表。如果只传递一个值,它将返回该值

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


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

否,您需要将承诺对象从一个thenable传递到下一个thenable。如果只传递一个值,它将返回该值

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


自2018年3月14日起更新:此答案不正确。请参考@Bergi的评论,是的!这是完全可以的,对于一些人来说,这是通过承诺链传递数据的首选方式(因为它不涉及承诺块范围之外的任何全局变量)

在您的情况下,由于您希望在上一个承诺中包含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 => {});

对!!这是完全可以的,对于一些人来说,这是通过承诺链传递数据的首选方式(因为它不涉及承诺块范围之外的任何全局变量)

在您的情况下,由于您希望在上一个承诺中包含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 => {});

是的,这完全没问题,尽管可能有。哇,那太完美了!OHMG只是一个提示,
Promise.resolve(updateMongoStatus)
不会返回
Promise
而是
Promise
。你的意思可能是
Promise.resolve()。然后(updateMongoStatus)
是的,这完全可以,尽管可能有。哇,这太完美了!OHMG只是一个提示,
Promise.resolve(updateMongoStatus)
不会返回
Promise
而是
Promise
。你的意思可能是
Promise.resolve()。然后(updateMongoStatus)
你在自相矛盾。首先你说一个人需要返回一个承诺,但是你说返回一个值也有效?也许我对链接承诺的理解是错误的。但是,如果您不向下一个thenable传递承诺,那么链接多个thenable的目的是什么呢?通常是简单性。当然,多个相互链接的同步回调可以合并到一个回调中,但是如果函数已经作为构建块存在,那么您可以多次调用
。示例
.then(JSON.parse).then(printData)
简单。then(函数(结果){returnprintdata(JSON.parse(result));})
你在自相矛盾。首先你说一个人需要返回一个承诺,但是你说返回一个值也有效?也许我对链接承诺的理解是错误的。但是,如果您不向下一个thenable传递承诺,那么链接多个thenable的目的是什么呢?通常是简单性。当然,多个相互链接的同步回调可以合并到一个回调中,但是如果函数已经作为构建块存在,那么您可以多次调用
。示例
.then(JSON.parse).then(printData)
.then(函数(结果){returnprintdata(JSON.parse(result));})简单。