<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Right, it doesn’t look like one needs to know the returned value when forwarding `return()`.</div><div class=""><br class=""></div><div class="">But: you need to guard against other ways of reaching `finally`. Maybe like this:</div><div class=""><br class=""></div><div class="">```js</div><div class=""><div class="">function* take(n, iterable) {</div><div class="">    let iterator = iterable[Symbol.iterator]();</div><div class="">    n = +n; // make sure it's a number, so that n>0 does never throw</div><div class="">    let forwardReturn = true;</div><div class="">    try {</div><div class="">        while (n > 0) {</div><div class="">            let item = iterator.next();</div><div class="">            if (item.done) {</div><div class="">                forwardReturn = false;</div><div class="">                return item.value;</div><div class="">            }</div><div class="">            yield item.value;</div><div class="">            n--;</div><div class="">        }</div><div class="">        forwardReturn = false;</div><div class="">    } catch (e) {</div><div class="">        forwardReturn = false;</div><div class="">        iterator.throw(e);</div><div class="">    } finally {</div><div class="">        if (forwardReturn) {</div><div class="">            iterator.return();</div><div class="">        }</div><div class="">    }</div><div class="">}</div></div><div class="">```</div><div><blockquote type="cite" class=""><div class="">The above code also has the additional nice property that it call `.return()` on the iterator when `n` values have been taken out of it.<br class=""></div></blockquote><br class=""></div><div>That’s not what all the other constructs in ES6 do: they only call `return()` if iteration stops abruptly.</div><div><br class=""></div><div>Also missing from this code: checking whether the iterator actually has the methods `return()` and `throw()` and responding accordingly.</div><div><br class=""></div><div apple-content-edited="true" class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">-- <br class="">Dr. Axel Rauschmayer<br class=""><a href="mailto:axel@rauschma.de" class="">axel@rauschma.de</a><br class="">rauschma.de<br class=""></div></div></div></div><br class="Apple-interchange-newline"><br class="Apple-interchange-newline">
</div>
<br class=""></body></html>