【问题标题】:Why is the optional return() method of es6 iterator interface take in an value argument. And why does it need to return an IteratorResult object?为什么 es6 迭代器接口的可选 return() 方法接受一个值参数。为什么它需要返回一个 IteratorResult 对象?
【发布时间】:2018-06-24 21:46:25
【问题描述】:

这是用 TypeScript 表达的 es6 迭代器接口(复制自 Axel Rauschmayer 的探索 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对象?

【问题讨论】:

  • 代码示例好吗?不确定你在说什么。

标签: ecmascript-6 interface iterator


【解决方案1】:

为了确保我们在同一个页面上,迭代器的 .return 方法在调用时通常表现为在当前暂停位置处的强制 return。这意味着函数本身中没有进一步的代码将实际运行。对于像这样的 sn-p:

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

在做

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

谁能想到一个 es6 迭代器的可选返回方法需要接收值的用例?

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

...返回一个 IteratorResult?

如果不是这样,它应该返回什么?虽然大多数迭代器调用者都没有处理,但从技术上讲,另一个 yield 可以在您调用 .return 时运行,因此它实际上可能还没有完成迭代器的执行。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      相关资源
      最近更新 更多