承诺版本的“while”循环?

时间:2016-05-31 17:49:15

标签: javascript node.js promise bluebird

我已经认识到,由于ECMAScript 6中的promise允许异步函数的同步编码,因此对于每个承诺的代码片段都有一个同步的推论。例如:

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作为我的承诺库,因此我可以访问他们所有的帮助方法。

1 个答案:

答案 0 :(得分:6)

  

我觉得应该可以使用递归

完全。您可以为回调命名,以便再次引用它。只要条件不满足,就从回调中返回一个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
  });