Я разработал клиентскую библиотеку, которая предоставляет метод под названием iterator()
. Этот метод возвращает экземпляр Promise, созданный с использованием библиотеки require('promise')
, которая завершается объектом итератора.Нерекурсивный метод для повторения итератора Promise
Этот объект содержит метод, называемый next()
, который возвращает Promise, который завершается со сложным объектом, как это: {done: [true|false], key: _, value: _}
Хотя iterator()
может упреждающего некоторые элементы, next()
потребности вернуть обещание в случае, если это приводит к удаленный вызов.
Теперь, скажем, пользователь хочет перебрать все элементы до тех пор, пока обещание, возвращаемое next()
, не возвращает объект, содержащий 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
Похоже, что вы ищете генератор или наблюдаемый. – ssube
вы можете использовать другое решение, которое _hides_ рекурсия для вас, но это все равно будет рекурсивным решением – smnbbrv
Galder, вы, вероятно, захотите прочитать раздел «The Collection Kerfuffle» [здесь] (http://taoofcode.net/promise- anti-patterns /) –