2016-04-25 12 views
1

約束を使ってDynamoDBテーブルからすべてのレコードを取得しようとしています。問題は、DynamoDBが複数の呼び出しを行う必要がある呼び出しですべての項目を返さないということです。 LastEvaluatedKeyがnullでない場合は、残りのレコードを取得するためにそのキーで別の呼び出しを行う必要があることを意味します。私のコードでは、それをチェックし、LastEvaluatedKeyがnullの場合にのみ解決します。しかし、console.log("done")は実行されていません。Bluebird約束ループ

function query(params) { 
    return new Promise(function(resolve, reject) { 
     docClient.query(params, function(err, data) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(data); 
      } 
     });  
    }) 
} 

function getAllRecords(params, combinedData) { 
    return new Promise(function(resolve, reject) { 
     query(params) 
     .then(function(data) { 
      if(!combinedData) { 
       combinedData = []; 
      } 
      combinedData.push(data.Items); 
      if(data.LastEvaluatedKey) { 
       params.ExclusiveStartKey = data.LastEvaluatedKey; 
       getAllRecords(params, combinedData) 
      } 
      else { 
       resolve(combinedData); 
      } 
     })  
    }) 


} 

getAllRecords(params) 
.then(function() { 
    console.log('done') 
}) 
.catch(function(error) { 
    console.log(error); 
}) 

それはおそらく約束は私の部分からどのように機能するかについての誤解です:

は、ここに私のコードです。誰かが私にこの仕事をする方法を知らせることができれば。それは素晴らしいだろう。

+0

は避けてください[ 'Promise'コンストラクタアンチパターン](http://stackoverflow.com/q/23803743/1048572)! – Bergi

答えて

1

あなたはexplicit promise construction antipatternの犠牲になりました。あなたは、必要がないときに約束を手動で構築しています。

通常、Promiseコンストラクタを使用する必要があるのは、非Promise非同期コードをPromise非同期コードに変換するときだけです。 query()関数ですでにこれを行っているので、getAllRecords()関数でPromiseコンストラクタを使用する必要はありません。

あなたは代わりにこれを行う必要があります。

function getAllRecords(params) { 
    return query(params).then(function (data) { 
     var items = [data.Items]; 

     if(data.LastEvaluatedKey) { 
      params.ExclusiveStartKey = data.LastEvaluatedKey; 

      return getAllRecords(params).then(function (theRest) { 
       return items.concat(theRest); 
      }); 
     } 

     return items; 
    }); 
} 
+0

これは、約束の反パターンのための答えです。ありがとう –

関連する問題