2017-11-21 19 views
0

私はNodejsを初めて使い、この問題を理解するのに問題があります。配列に対してdescribe関数を実行しようとしましたが、AWS関数はmain関数の終了後に実行されているようです。ループスルーAWSラムダNodejs SDK関数

は、ここでの主な機能です:2つの項目を処理する必要があるデバッグログに基づいて(ACM ARNSのリストスルーループとステータスを確認してください)

var checkCertStatus = function(resolveObj){ 
    var promise = new Promise(function(resolve, reject){ 

     console.log('1'); 
     var retObj=''; 
     resolveObj.Items.forEach(function(element) { 
      var certDescribeParams = { 
       CertificateArn: element.sslCertId 
      }; 
      console.log('2'); 
      acm.describeCertificate(certDescribeParams, function(err, data) { 
       if(err) reject(new Error(err)); 
       else  { 
        console.log(data.Certificate.DomainName + ': ' + data.Certificate.Status); 
        retObj+=data; 
       } 
      }); 
     }); 
     console.log('3'); 
     resolve(retObj); 
     return promise; 
    }) 
} 

、と仮定すると、私が得たもの:

1 
2 
2 
3 
example.com: ISSUED 
example2.com: ISSUED 

基本的に、私はこの結果をチェーンの次の関数(約束事)に渡す必要があります。

答えて

1

ようこそNode.js!一般的に言えば、非同期プログラミングスタイルについて勉強することは役に立ちます。特に、Promisescallbacksを混合しているように見えます。これは、この例を必要以上に混乱させる可能性があります。 AWS SDKの組み込み機能を使用して、応答を約束に変換することをお勧めします。

私が気付く最初のことは、あなたが手動で解決/拒否機能を使ってPromiseを構築していることです。これは、ライブラリを作成していない限り、しばしば赤い旗です。他のほとんどの図書館は、あなたが単純に使用して連鎖できる約束をサポートしています。 (これには前述のAWS SDKが含まれます)

私が気付く2つ目は、checkCertStatus関数は何も返しません。それはプロミスを作成しますが、最後にそれを返しません。 return promise;行は実際にPromiseを作成するために使用されるコールバック関数内にあります。

個人的に約束をするときは、Bluebirdライブラリを使用することをお勧めします。それはmapのようなメソッドを含むネイティブよりもフル機能のプロミスを提供します。便利なことに、hereのようにAWS.config.setPromisesDependency()で代替プロミスコンストラクタを使用するようにAWS SDKをコンフィグレーションすることができます。

const Promise = require('bluebird'); 
AWS.config.setPromisesDependency(Promise); 

const checkCertStatus = (resolveObj) => { 
    const items = resolveObj.Items; 
    console.log(`Mapping ${items.length} item(s)`); 
    return Promise.resolve(items) 
     .map((item) => { 
      const certDescribeParams = { 
       CertificateArn: item.sslCertId, 
      }; 
      console.log(`Calling describeCertificate for ${item.sslCertId}`); 
      return acm.describeCertificate(certDescribeParams) 
       .promise() 
       .then((data) => { 
        console.log(`${data.Certificate.DomainName}: ${data.Certificate.Status}`); 
        return data; 
       }); 
     }); 
}; 

我々はresolveObjに取り、resolveObj.Itemsから始まる約束チェーンを返す関数としてcheckCertStatusを定義している:

があなたのロジックを簡素化するために、あなたはこれらの線に沿って何か(未テストコード)を試してみてください。 ( Arrow Functionsにまだ慣れていないとお詫び申し上げます)このチェーンの最初の唯一のステップは、 items配列を acm.describeCertificateメソッドから返されたPromisesの新しい配列にマップすることです。これらの個別の約束のいずれかが失敗した場合、最上位の約束の連鎖も拒否されます。それ以外の場合は、最上位のPromiseチェーンが結果の配列に解決されます。 (個別の結果をログに記録するには、不都合な .thenステップが含まれていますが、その句は完全に削除することができます)。

コードが間違っていたら謝ります。

+0

私は 'resolve' /' .map'コンボではなく、 'Promise.map(items、)'を使うことができます.は上記の '.map'の引数です。それは基本的に略記です。 –