2016-04-25 92 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

由于承诺反模式,做出这个答案。谢谢 –