蓝鸟承诺循环
Bluebird promise loop
我正在尝试使用承诺从 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;
});
}
相关文章:
- 等待循环调用的所有承诺完成
- 而循环使用蓝鸟承诺
- 蓝鸟承诺循环
- javascript承诺在循环中或如何逐个调用函数
- 循环中的承诺问题
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 在循环中解析所有承诺后返回值
- 从 foreach 循环链接承诺
- 链接在webdriver.io中的while循环中承诺
- 循环超出范围,不执行承诺链
- 在nodejs中使用Q.js承诺进行循环的正确方法
- 如何仅从循环中调用最后的承诺
- 同时循环承诺,直到另一个承诺结束
- AngularJS:app.run() 中的承诺永远陷入循环
- JavaScript ES6 承诺在 while 循环中调用异步操作
- JavaScript循环承诺在参数中使用数组进行迭代
- Javascript for循环承诺
- Angular JS循环承诺
- 打破循环/承诺并从函数返回
- 无限期地循环承诺,直到被拒绝