Search code examples
javascriptes6-promise

Generator not evaluating promises


Why doesn't the generator wait for the asynchronous prm promise to complete before moving on to the next yield?

function *verify() {
    try {
        let prm = new Promise((resolve,reject) => {
            resolve("abc");
        })
        let k = yield prm
        console.log(k)
        yield 1;
        console.log("1")
        yield 2;
        console.log("2")
        yield 3;
        console.log("3")
    } catch (err) {
        console.log("error")
    }
}

var gen = verify()
while (!gen.next().done) {}

returns

undefined
1
2
3

Solution

  • Because a generator - on its own - doesn't wait for anything. It just emits what you were yielding from the next() call. You could of course have your loop wait when before calling next again when it gets a promise.

    What you are thinking of is async/await. You want to write

    async function verify() {
        try {
            let prm = new Promise((resolve,reject) => {
                resolve("abc");
            })
            let k = await prm
            console.log(k)
            console.log("1")
            console.log("2")
            console.log("3")
        } catch (err) {
            console.log("error")
        }
    }
    
    var prm = verify();