2016-04-25 17 views
1

Ich versuche, alle Datensätze aus einer DynamoDB-Tabelle mit Versprechungen zu erhalten. Das Problem ist, dass DynamoDB nicht alle Elemente in einem Aufruf zurückgibt, muss ich mehrere Anrufe tätigen. Wenn LastEvaluatedKey nicht null ist, muss ich einen weiteren Aufruf mit diesem Schlüssel durchführen, um die verbleibenden Datensätze zu erhalten. In meinem Code überprüfe ich dies und behebe nur, nachdem LastEvaluatedKey null ist. Aber die console.log("done") wird nicht ausgeführt.Bluebird Versprechen Schleife

Hier ist mein Code:

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); 
}) 

Es ist wahrscheinlich eine falsche Vorstellung darüber, wie Versprechungen Arbeit von meiner Seite. Wenn mir jemand eine Idee geben kann, wie man das macht. Das wäre großartig.

+0

Vermeiden Sie die [ 'Promise' Konstruktor Antipattern] (http://stackoverflow.com/q/23803743/1048572)! – Bergi

Antwort

1

Sie sind Opfer der explicit promise construction antipattern geworden, in der Sie Versprechungen manuell konstruieren, wenn Sie nicht brauchen.

Im Allgemeinen müssen Sie den Promise-Konstruktor nur verwenden, wenn Sie nicht-Promise-Async-Code in Promise-Async-Code konvertieren. Sie haben dies bereits in Ihrer query()-Funktion getan, sodass Sie den Promise-Konstruktor in Ihrer getAllRecords()-Funktion nicht verwenden müssen.

Sie sollten diese stattdessen tun:

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

Dies ist die Antwort wegen des Versprechens Antipattern. Vielen Dank –

Verwandte Themen