【发布时间】:2016-07-21 14:02:06
【问题描述】:
我开发了一个客户端库,它公开了一个名为iterator() 的方法。该方法返回一个使用require('promise')库创建的Promise实例,该实例由一个迭代器对象完成。
此对象包含一个名为 next() 的方法,该方法返回一个 Promise,该 Promise 由一个复杂的对象完成,如下所示:{done: [true|false], key: _, value: _}
尽管iterator() 可能会预取一些元素,next() 需要返回一个 Promise 以防它导致远程调用。
现在,假设用户想要遍历所有元素,直到 next() 返回的 Promise 返回包含 done: true 的对象。
我已经设法使用以下递归方法实现了这一点(我最初在answer 中找到了这个解决方案):
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;
});
});
问题是,是否有可能使用require('promise') 库来构建非递归解决方案?我对非递归方法感兴趣的原因是,如果要迭代的条目数量太大,可以避免崩溃。
干杯, 高德
【问题讨论】:
-
听起来你正在寻找一个生成器或可观察对象。
-
您可以使用另一种解决方案,为您隐藏递归,但它仍然是递归解决方案
-
Galder,您可能想阅读标题为“The Collection Kerfuffle”的部分here
-
我们还没有到达那里,但是已经到达那里了:) 查看答案。
-
@Roamer-1888,感谢您的指点,但该部分假定您有一个数组或知道您需要循环多少个元素,因此不适用于此处。
标签: javascript promise