gpt4 book ai didi

javascript - 迭代 Promise 迭代器的非递归方法

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:10 27 4
gpt4 key购买 nike

我开发了一个客户端库,它公开了一个名为 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') 库来构建非递归解决方案?我对非递归方法感兴趣的原因是为了避免在要迭代的条目数太大时崩溃。

干杯,高尔德

最佳答案

The reason I'm interested in a non-recursive method is to avoid blowing up if the number of entries to iterate over is too big

不要害怕。异步“递归”(有时称为 pseudo-recursion )不会增加调用堆栈,它很像尾递归。您永远不会遇到 stackoverflow 异常。

如果合理地实现了 promise 库,这甚至不会增加内存 - 有关详细信息,请参阅 Building a promise chain recursively in javascript - memory considerations

关于javascript - 迭代 Promise 迭代器的非递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36361827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com