Opracowałem bibliotekę klienta, która udostępnia metodę o nazwie iterator()
. Ta metoda zwraca instancję Promise utworzoną przy użyciu biblioteki require('promise')
, którą uzupełnia obiekt iteratora.Nierekurencyjna metoda iteracji nad iteratorem obietnicy
Cel ten zawiera metodę zwaną next()
która zwraca Promise, co dokonywane jest z kompleksem przedmiotu, jak to: {done: [true|false], key: _, value: _}
Chociaż iterator()
może wstępnego ładowania kilka elementów, next()
musi zwracać obiecujące w przypadku skutkuje połączenie zdalne.
Teraz powiedzmy, że użytkownik chce iterować po wszystkich elementach, dopóki obietnica zwrócona przez next()
nie zwróci obiektu zawierającego done: true
.
udało mi się to osiągnąć stosując następujący sposób rekurencyjny (I pierwotnie znaleźć takie rozwiązanie w tej 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;
});
});
Chodzi o to, byłoby to możliwe, przy użyciu require('promise')
bibliotekę, budować rozwiązanie nierekurencyjne? Powodem, dla którego interesuje mnie metoda nierekursywna, jest unikanie wysadzania w powietrze, jeśli liczba wpisów do iteracji jest zbyt duża.
Cheers, Galder
Wygląda na to, że szukasz generatora lub obserwujesz. – ssube
możesz użyć innego rozwiązania, które wykrywa rekursję dla ciebie, ale nadal będzie to rozwiązanie rekursywne. – smnbbrv
Galder, prawdopodobnie chcesz przeczytać sekcję zatytułowaną "Kolekcja Kerfuffle" [tutaj] (http://taoofcode.net/promise- anti-patterns /) –