Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript yield from the function nested inside generator

Tags:

This code generates an error:

function *giveNumbers() {
    [1, 2, 3].forEach(function(item) {
        yield item;
    })
}

This is probably because yield is inside a function that is not a generator. Is there an elegant way to overcome this? I mean other than:

function *giveNumbers() {
    let list = [1, 2, 3];
    for (let i = 0; i < list.length; i++) {
        yield list[i];
    }
}
like image 473
Dima Slivin Avatar asked Dec 05 '15 11:12

Dima Slivin


2 Answers

This is probably because yield is inside a function that is not a generator.

Yes. You cannot use yield from callbacks.

Is there an elegant way to overcome this?

Depends on the use case. Usually there is zero reason to actually want to yield from a callback.

In your case, you want a for…of loop, which is superior to .forEach in almost every aspect anyway:

function *giveNumbers() {
    for (let item of [1, 2, 3])
        yield item;
}
like image 153
Bergi Avatar answered Oct 01 '22 02:10

Bergi


you can use the yield * syntax.

function *giveNumbers() {
    yield * [1, 2, 3].map(function(item) {
        return item;
    })
}
like image 24
asmn Avatar answered Oct 01 '22 03:10

asmn