2017-05-21 7 views
3

私は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; 
} 
+0

「Promise.each」とは何ですか? – Bergi

+0

重要な点は、Bluebirdが使用されていることです(.each)。そのコールバックは非同期関数ではありません。 – estus

+0

@estusああ、ありがとう。しかし、それは問題ではありません:*反復子関数が約束を返すならば、次の反復を続ける前に約束の結果が待たれます。*](http://bluebirdjs.com/docs/api /promise.each.html) – Bergi

答えて

8

ここにあなたの問題だ:stack.deployasync functionであることを

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

お知らせ?つまり、それは約束を返します - outputsプロパティのインスタンスではありません。あなたは約束した.outputsにアクセスしています。これはundefinedです。awaitはうまくいっていますが、約束と拒否は無視されます。

あなたは

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

を書いたり、インスタンスのヘルパー変数を使用する必要があります。

関連する問題