Gal*_*eño 6 javascript promise
我开发了一个客户端库,它公开了一个名为的方法iterator().此方法返回使用require('promise')库创建的Promise实例,该实例使用迭代器对象完成.
该对象包含一个调用的方法next(),该方法返回一个Promise,它使用如下复杂对象完成:{done: [true|false], key: _, value: _}
虽然iterator()可能预先获取一些元素,next()但是如果它导致远程调用,则需要返回Promise.
现在,假设用户想要迭代所有元素,直到返回的Promise返回next()包含的对象done: true.
我已经设法使用以下递归方法实现了这一点(我最初在这个答案中找到了这个解决方案):
var iterate = client.iterator();
iterateTeams.then(function(it) {
function loop(promise, fn) {
// Simple recursive loop over iterator's next() call
return promise.then(fn).then(function (entry) {
return !entry.done ? loop(it.next(), fn) : entry;
});
}
return loop(it.next(), function (entry) {
console.log('entry is: ' + entry);
return entry;
});
});
Run Code Online (Sandbox Code Playgroud)
问题是,是否可以使用require('promise')库来构建非递归解决方案?我对非递归方法感兴趣的原因是,如果要迭代的条目数太大,就要避免爆炸.
干杯,高尔德
我对非递归方法感兴趣的原因是为了避免在迭代的条目数量太大时发生崩溃
别害怕。异步“递归”(有时称为伪递归)不会增加调用堆栈,它很像尾递归。你永远不会遇到 stackoverflow 异常。
如果 Promise 库实现合理,这甚至不应该增加内存 - 有关详细信息,请参阅Building a Promise chain recursively in javascript - 内存注意事项。