繁体   English   中英

Promise版本的“ while”循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM