Почему необязательный метод return () интерфейса итератора es6 принимает аргумент value. И почему он должен возвращать объект IteratorResult? - PullRequest
0 голосов
/ 25 июня 2018

Это интерфейс итератора es6, выраженный в TypeScript (копия из исследования es6 Акселя Раушмайера

interface Iterable {
    [Symbol.iterator]() : Iterator;
}
interface Iterator {
    next() : IteratorResult;
    return?(value? : any) : IteratorResult;
}
interface IteratorResult {
    value: any;
    done: boolean;
}

Вопрос 1. Почему необязательный метод return () интерфейса итератора es6 принимает один аргумент?(значение?: любое)

Вопрос2: А зачем ему возвращать объект IteratorResult?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вопрос2: зачем нужно возвращать объект IteratorResult?

function* gen(){
      yield 123;
      return 'ended value';
   }

   let iter = gen();
   
   console.log(iter.next());//{value: 123, done: false}
   console.log(iter.next());//{value: "ended value", done: true}
   
   iter = gen();//restart iter;
   console.log([...iter]);//[123] - "end value" is ignored

Несмотря на то, что это игнорируется оператором распространения и циклом for-of, цикл итерации javascript позволяет последнему IteratorResult иметь значение (в данном случае «конечное значение»). Это означает, что необязательный метод return () интерфейса должен возвращать IteratorResult.

Вопрос1: Почему return () должна принимать значение в качестве аргумента?

Сказано Es6

Возвращаемый объект IteratorResult, как правило, будет иметь свойство done со значением true и свойство value со значением, переданным в качестве аргумента метода возврата. Однако это требование не выполняется.

0 голосов
/ 25 июня 2018

Чтобы убедиться, что мы находимся на той же странице, метод итератора .return обычно ведет себя как принудительный return в текущем приостановленном месте при вызове.Это означает, что никакой дополнительный код в самой функции фактически не будет работать.Для фрагмента вроде:

var makeIter = function*(){};
var iter = makeIter();

, выполняющего

var result = iter.return(4);
// { value: 4, done: true }

Кто-нибудь может подумать о случае использования, когда необязательному методу возврата итератора es6 необходимо получить значение?

Что еще это вернет?Это может быть жестко задано для возврата undefined, но не похоже, что есть большая причина не разрешать указывать возвращаемое значение.

... возвращать IteratorResult?

Что он должен вернуть, если не это?Хотя это и не обрабатывается большинством вызывающих итераторов, технически другой yield может запускаться при вызове .return, поэтому он, возможно, еще не завершил выполнение итерируемого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...