蓝鸟承诺循环

Bluebird promise loop

本文关键字:循环 承诺 蓝鸟      更新时间:2023-09-26

我正在尝试使用承诺从 DynamoDB 表中获取所有记录。问题是 DynamoDB 不会在一次调用中返回所有项目,我必须进行多次调用。 如果 LastEvaluatedKey 不为 null,则意味着我需要使用该键进行另一次调用才能获取剩余的记录。在我的代码中,我正在检查这一点,并且仅在 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);
})

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

你已经成为显式承诺构造反模式的牺牲品,在这种反模式中,你在不需要的时候手动构造承诺。

通常,唯一需要使用 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;
    });
}