javascript – 为什么这个生成器跳过try块之外的yield?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么这个生成器跳过try块之外的yield?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

我正在试验Generator.prototype.throw()的工作原理并制作了这个例子:

var myGen = function *() {

    try{
        yield 1;
        yield 2;
        yield 3;
        yield 4;
        yield 5;
    }

    catch(err) {

        console.log(err);
    }

    yield 7;
    yield 8;
    yield 9;

}

var myIterator = myGen();

console.log(myIterator.next());
console.log(myIterator.next());
console.log(myIterator.next());

myIterator.throw(new Error('Bullocks!'));

console.log(myIterator.next());
console.log(myIterator.next());
console.log(myIterator.next());

在运行时导致以下结果:

{ value: 1,done: false }
{ value: 2,done: false }
{ value: 3,done: false }
[Error: Bullocks!]
{ value: 8,done: false }
{ value: 9,done: false }
{ value: undefined,done: true }

我可以理解,在抛出错误之后会跳过yield 4和try块的剩余部分.

但为什么发电机跳过产量为7?

解决方法

它不会跳过yield 7.当你调用throw()时,控制流进入catch块,记录错误,然后继续执行,直到新的迭代器结果对象的下一个yield {value:7,完成:false}返回.

只是在你的代码中你没有console.log这个特定的结果对象.尝试:

console.log(myIterator.throw(new Error('Bullocks!')));

这在step 11 and 13 of the spec中解释:

  1. Resume the suspended evaluation of genContext using abruptCompletion as the result of the operation that suspended it. Let result be the completion record returned by the resumed computation.
  2. (…)
  3. Return Completion(result).
原文链接:https://www.f2er.com/js/149864.html

猜你在找的JavaScript相关文章