Можем ли мы передать параметры в генератор, когда мы итерируем его через for..of?
Я думаю о сценарии создания очереди обещаний:
//Let's assume that promises is an array of promises
var promiseQueue = [];
for (var promise of promises) {
if (promiseQueue.length) promiseQueue[promiseQueue.length - 1].then(promise);
promiseQueue.push(promise);
}
Я думаю о реализации function
называется resolver
:
function *resolve() {
var promise;
while (promise = yield) Promise.resolve(promise);
}
и затем повторяем это:
var promiseGenerator = resolve();
Проблема в том, что здесь будет отвечать за фактическую итерацию:
for (var r of promiseGenerator) {
}
В приведенном выше коде генератор будет успешно повторен, но, к сожалению, я не знаю, как успешно передать параметр этому генератору при итерации for..of.
Я хотел бы уточнить, что мне не нужна альтернатива, я прекрасно понимаю, что мы можем сделать что-то вроде этого:
for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
Мне особенно интересно узнать, могу ли я передать параметры генератору при выполнении цикла for..of.
1 ответ
Нет, невозможно передать аргументы next
,
function* generateItems() { /* ... */ }
for (var item of generateItems()) {
console.log(item);
}
в основном не хватает
function* generateItems() { /* ... */ }
var iterator = generateItems()[Symbol.iterator]();
do {
const result = iterator.next();
if (result.done) break;
const item = result.value;
console.log(item);
} while (true);
за исключением нескольких пропавших без вести try/catch
оберток. Вы можете увидеть в спецификации здесь, что он вызывает .next
без аргументов:
Пусть nextResult будет? Вызов (iteratorRecord. [[NextMethod]], iteratorRecord. [[Iterator]], "").
например
iterator.next.apply(iterator, []);
призвание next()
с пустым массивом аргументов.