为什么这个Node片段没有被捕获拒绝Promise?

时间:2017-05-21 20:42:37

标签: node.js ecmascript-6 promise async-await bluebird

我试图理解为什么我遇到的承诺拒绝例外不存在 由我在以下代码中的初始try / catch处理(完整代码在this branch

在此特定错误中,在index.js中调用了nodeCf.deploy

错误正在发生,因为我应该使用this.deployName,而不是stack.deployName 在我的console.log语句中。

我不明白的原因是为什么这被认为是一种不受欢迎的承诺拒绝。 我不应该在对nodeCf.deploy的初始调用中遇到try / catch吗?

// index.js:

  switch (args.action) {
    case 'deploy':
      try {
        await nodeCf.deploy(stacks, envVars);
      } catch (e) {
        console.log(`deployment failed: `, e);
        process.exit(1);
      }
      break;
  < ... >

// nodeCf module:
async deploy(stacks, envVars) {
  var stackOutputs = {};
  await Promise.each(stacks, async(stack) => {
    stackOutputs[stack.name] = await stack.deploy(envVars, 
      stackOutputs).outputs;
  });
}

// stack.deploy:
async deploy(envVars, stackOutputs) {
this.load(envVars, stackOutputs);
await ensureBucket(this.infraBucket);
const s3Resp = await this.uploadTemplate()
const stackResp = await ensureAwsCfStack({
  StackName: this.deployName,
  Parameters: this.parameters,
  Tags: this.tags,
  TemplateURL: s3Resp.Location,
  Capabilities: [ 'CAPABILITY_IAM', 
    'CAPABILITY_NAMED_IAM' ]
});
this.outputs = _.map(stackResp.Outputs, (it) => 
  _(it).pick(['OutputKey', 'OutputValue'])
    .toPairs()
    .unzip()
    .tail()
    .fromPairs()
    .value());
console.log(`deployed ${stack.deployName}`); // 'stack' is causing exception
return this;
}

1 个答案:

答案 0 :(得分:8)

这是你的问题:

stackOutputs[stack.name] = await stack.deploy(envVars, stackOutputs).outputs;

请注意stack.deployasync function?这意味着它返回一个promise - 而不是具有outputs属性的实例。您正在访问.outputs的承诺,undefinedawait即可,但承诺及其拒绝将被忽略。

你需要写

stackOutputs[stack.name] = (await stack.deploy(envVars, stackOutputs)).outputs;
//                         ^                                         ^

或为实例使用辅助变量。