何时在JavaScript迭代器中使用throw(错误)和return(value)?

问题描述 投票:0回答:1

在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(...

javascript iterator redux-saga
1个回答
0
投票

首先,并非所有迭代器都具有返回和抛出的作用。迭代器唯一需要的是next。但是,由生成器函数创建的迭代器确实具有returnthrow

© www.soinside.com 2019 - 2024. All rights reserved.