ste*_*esu 2 javascript node.js promise bluebird
我来实现,由于在ECMAScript中6承诺允许异步功能同步编码,对于每一个代码的承诺载货件有一个同步的必然结果.例如:
var data = processData(JSON.parse(readFile(getFileName())));
Run Code Online (Sandbox Code Playgroud)
是相同的:
var data = getFileName()
.then(readFile)
.then(JSON.parse)
.then(processData);
Run Code Online (Sandbox Code Playgroud)
现在,对于我目前的用例,我想编写代码来从大量的公共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;
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如何用承诺做到这一点?我可以这样写:
var data = [];
var offset = 0;
var total = 10000;
getDataFromAPI(offset)
.then(function(newData){
data.concat(newData);
return getDataFromAPI(data.length);
});
Run Code Online (Sandbox Code Playgroud)
但在这一点上,我被迫只是链接无限.thens - 没有循环逻辑.我觉得应该可以使用递归,但我不知道如何做到这一点.
我使用BluebirdJS作为我的诺言库,所以我可以访问他们所有的帮助方法.
我觉得使用递归应该是可能的
究竟.您可以为回调命名,以便再次引用它.只要条件不满足,就从回调中返回一个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
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |