Skip to content

Instantly share code, notes, and snippets.

@nathggns
Last active August 29, 2015 14:22

Revisions

  1. nathggns revised this gist May 27, 2015. 1 changed file with 17 additions and 2 deletions.
    19 changes: 17 additions & 2 deletions await.es6.js
    Original file line number Diff line number Diff line change
    @@ -1,20 +1,35 @@
    function await(generatorFunction) {
    let gen = generatorFunction();

    /**
    * @param {any?} err The error to throw in the generator, where yield was last called.
    * @param {any?} result The result to pass to the genarator for the last call to yield
    */
    function next(err, result) {
    // If the last promise that was yielded was rejected,
    // trigger an error inside the generator where yield was last called
    if (err) {
    gen.throw(err instanceof Error ? err : new Error(err));
    gen.throw(
    // Make sure that the error we're passing is actually an error and not just a string
    err instanceof Error ? err : new Error(err)
    );
    }

    let nextResult = gen.next(result);
    // Get the next promise from the generator
    let nextResult = gen.next(
    result
    );
    let value = nextResult.value;

    // If we're done with the generator, no need to keep going.
    if (nextResult.done) {
    return;
    }

    value.then(
    // We have a value, call next again to pass it back into the generator and keep going
    result => next(null, result),
    // We have an error, throw it in the generator
    e => next(e)
    );
    }
  2. nathggns created this gist May 27, 2015.
    44 changes: 44 additions & 0 deletions await.es6.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    function await(generatorFunction) {
    let gen = generatorFunction();

    function next(err, result) {
    if (err) {
    gen.throw(err instanceof Error ? err : new Error(err));
    }

    let nextResult = gen.next(result);
    let value = nextResult.value;

    if (nextResult.done) {
    return;
    }

    value.then(
    result => next(null, result),
    e => next(e)
    );
    }

    next();
    }

    function generateRandomNumber() {
    return new Promise(resolve => setTimeout(() => resolve(Math.random()), 2000));
    }

    function makeError() {
    return new Promise((r, reject) => reject('Some error'));
    }

    await(function*() {
    try {
    console.log('Starting random number generator');
    console.log('Random number is', yield generateRandomNumber());
    console.log('Starting another random number generator');
    console.log('Another random number is', yield generateRandomNumber());
    console.log('Throwing error');
    yield makeError();
    } catch (e) {
    console.error('Caught error', e);
    }
    });