为什么es6迭代器接口的可选return()方法采用value参数。为何需要返回IteratorResult对象?

时间:2018-06-24 21:46:25

标签: ecmascript-6 interface iterator

这是用TypeScript表示的es6 Iterator接口(由Axel Rauschmayer的explorer es6复制而成)

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

问题1:为什么es6迭代器接口的可选return()方法采用一个参数? (值?:任意)

问题2:为什么它需要返回IteratorResult对象?

2 个答案:

答案 0 :(得分:0)

为确保我们在同一页面上,迭代器的.return方法通常在调用时在当前暂停的位置上表现为强制return。这意味着该函数本身中将不再实际运行其他代码。对于如下代码段:

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

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

有人能想到用例中es6迭代器的可选return方法需要接收值吗?

它还会返回什么?返回undefined可能是硬编码的,但似乎没有太多理由不允许指定返回值。

  

...返回IteratorResult吗?

如果不是,它应该返回什么?尽管大多数迭代器的调用者都无法处理,但从技术上讲,当您调用yield时,可以运行另一个.return,因此它可能尚未真正完成可迭代对象的执行。

答案 1 :(得分:0)

  

问题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

即使spread运算符和for-of循环将其忽略,JavaScript迭代接口也允许最后的IteratorResult具有一个值(在这种情况下为“最终值”)。这意味着接口的可选return()方法必须返回IteratorResult。

  

问题1:为什么return()需要将值作为参数?

Es6 spec said

  

返回的IteratorResult对象通常将具有一个值为true的done属性,以及一个将其值作为return方法的参数传递的value属性。但是,没有强制执行此要求。