私はnodeCf.deploy
は、この特定のエラーでこのNodeスニペットが拒否されたPromiseをキャッチしないのはなぜですか?
(完全なコードがthis branchである)私が遭遇した約束拒否例外は は、次のコードで私の最初のtry/catchによって処理されていない理由を理解しようとしていますindex.jsで呼び出されます。
私のconsole.logステートメントにthis.deployName
でなく、stack.deployName
を使用しているため、エラーが発生しています。
私は分かりませんが、これは未処理の約束拒絶理由と考えられています。 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;
}
「Promise.each」とは何ですか? – Bergi
重要な点は、Bluebirdが使用されていることです(.each)。そのコールバックは非同期関数ではありません。 – estus
@estusああ、ありがとう。しかし、それは問題ではありません:*反復子関数が約束を返すならば、次の反復を続ける前に約束の結果が待たれます。*](http://bluebirdjs.com/docs/api /promise.each.html) – Bergi