2016-06-07 65 views
2

我知道使用next()方法的其中推进迭代yield关键字的下一位置,并返回其含有率表达的结果的对象,这样的:JavaScript生成器throw()方法提前迭代器?

收率双(40); =>调用iterator.next()将返回类似 {完成:假的,值:80}

不过我不是很清楚,如果掷()方法也将推动迭代器并返回下一yield的表达式,除了向生成器中抛出异常外。文档说是这样的:

的掷()方法通过抛出 误差引入它恢复的发电机的执行,并返回与完成两个属性和 值的对象。

当我们调用iterator.throw()时,它是否会将异常抛入生成器(异常被正确捕获),并前进到下一个yield关键字并返回yield表达式的结果?

请让我知道如果我需要包含代码片段来演示这一点,因为这是我在Stackoverflow上的第一篇文章。

谢谢!

回答

2

它确实使发生器从收到错误的收益中提前。但是,由于throw在yield的点处引发了异常,除非生成器代码准备好捕获异常并吞下它,否则生成器将不会恢复并且会完成(done设置为true),冒泡未捕获的异常到迭代器调用站点。

这里有一个简单的演示,请注意genDrunk扔了;) -

function* genSober() { 
 
    while(true) { 
 
    try { 
 
     yield 42; 
 
    } catch(e) { 
 
     console.log("I don't drink at work!"); 
 
    } 
 
    } 
 
} 
 

 
var g = genSober(); 
 
console.log(g.next()); 
 
// { value: 42, done: false } 
 
g.throw("Have some wine..."); 
 
console.log(g.next()); 
 

 
function* genDrunk() { 
 
    while(true) { 
 
    yield 42; 
 
    } 
 
} 
 

 
g = genDrunk(); 
 
console.log(g.next()); 
 
try { 
 
    g.throw("Have some wine..."); 
 
} 
 
catch (e){ 
 
} 
 
console.log(g.next());

+0

有明确的代码示范优良的答案。非常感谢!!! –