Можем ли мы передать параметры в генератор, когда мы итерируем его через 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() с пустым массивом аргументов.

Другие вопросы по тегам