2016-04-25 85 views
1

我想從使用承諾的DynamoDB表中獲取所有記錄。問題是DynamoDB不會在一次調用中返回所有項目,我必須進行多次調用。如果LastEvaluatedKey不爲空意味着我需要使用該密鑰進行另一次調用以獲取剩餘的記錄。在我的代碼中,我正在檢查並僅在LastEvaluatedKey爲空之後解析。但是console.log("done")沒有被執行。藍鳥諾言循環

這裏是我的代碼:

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

由於承諾反模式,做出這個答案。謝謝 –