蓝鸟承诺循环

Bluebird promise loop

我正在尝试使用 promises 从 DynamoDB table 获取所有记录。问题是 DynamoDB 不会 return 一次调用中的所有项目我必须进行多次调用。如果 LastEvaluatedKey 不为 null,则意味着我需要使用该键再次调用以获取剩余记录。在我的代码中,我检查并仅在 LastEvaluatedKey 为 null 后解析。但是 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);
})

这可能是我对 promises 如何运作的误解。如果有人可以给我一个想法如何使这项工作。那太好了。

您已成为 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;
    });
}