在javascript中,允许迭代器具有throw(error)
和return(value)
方法。 return(value)
使迭代器有机会看到value
,并有望返回{value: value, done: true}
。 throw(error)
使迭代器有机会查看并潜在地捕获错误。如果发现错误,则throw
应该返回下一个值。如果未捕获到异常,则它应等效于return(undefined)
。这是这些运作机制的示例:
function* test() {
try {
yield 1;
} catch(e) {}
const fromConsumer = yield 2;
yield fromConsumer;
// I know no way to access the value passed to return in a generator
}
const iter = test()[Symbol.iterator]();
console.log(iter.next());
console.log(iter.throw(new Error('catch me')));
console.log(iter.next(9));
console.log(iter.next());
console.log(iter.return(0));
(与jsfiddle相同)
我的问题是:为什么?对于迭代器的控制API的逆转,是否有人有可辩护的用例?在什么条件下,迭代器处理使用时发生的错误实际上有意义?考虑到肯定会结束迭代器并且不能进一步影响迭代器API的行为,您何时希望传递值返回?
我会说,我知道的一个用例是redux-saga,在那里他们利用了迭代器的控制API的反转,似乎是穷人的异步/等待。如果有人熟悉该工具的设计或使用,他们的选择还有其他好处吗?
在javascript中,允许迭代器具有throw(error)和return(value)方法。 return(value)使迭代器有机会看到value,并有望返回{value:value,done:true}。 throw(...
首先,并非所有迭代器都具有返回和抛出的作用。迭代器唯一需要的是next
。但是,由生成器函数创建的迭代器确实具有return
和throw
。