[英]Promise version of a “while” loop?
我已经意识到,既然ECMAScript 6中的诺言允许异步函数的同步编码,对于每一个充满诺言的代码都有一个同步的必然结果。 例如:
var data = processData(JSON.parse(readFile(getFileName())));
是相同的:
var data = getFileName()
.then(readFile)
.then(JSON.parse)
.then(processData);
现在,对于我当前的用例,我想编写代码以从庞大的公共API中提取数据。 该API是分页的,因此在纯同步世界中,我将编写以下内容:
var data = [];
var offset = 0;
var total = 10000; // For example - not actually how this would work
while( offset < total ) {
data.concat(getDataFromAPI(offset));
offset = data.length;
}
现在我的问题是,我将如何兑现承诺? 我可以这样写:
var data = [];
var offset = 0;
var total = 10000;
getDataFromAPI(offset)
.then(function(newData){
data.concat(newData);
return getDataFromAPI(data.length);
});
但是在这一点上,我被迫只链无限.then
s-没有循环逻辑。 我觉得使用递归应该有可能,但是我不知道该怎么做。
我将BluebirdJS用作我的Promise库,因此我可以访问他们所有的帮助器方法。
我觉得使用递归应该有可能
究竟。 您可以命名该回调,以便您可以再次引用它。 只要不满足条件,就从回调中返回一个Promise。 否则返回最终结果:
getDataFromAPI(offset)
.then(function next(newData){
data.concat(newData);
var newOffset = data.length;
return newOffset < total ? getDataFromAPI(newOffset).then(next) : data;
})
.then(function(data) {
console.log(data); // final result
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.