'use strict'; let d = require('debug')('gen2async'); let promisedNaturalAdd = require('./helpers').promisedNaturalAdd; function asyncify(generator) { function iterate(g, resolvedValue) { let i = g.next(resolvedValue); if (i.done) { return i.value; } return i.value.then(res => { return iterate(g, res); }, err => { g.throw(err); return iterate(g); }); } return function (args) { let g = generator.apply(generator, args); return iterate(g); } } function* gen() { d('START: gen'); let res; try { res = yield promisedNaturalAdd(10, 5); d('First result value (10, 5): %s', res); res = yield promisedNaturalAdd(10, -5); d('Second result value (10, -5): %s', res); } catch (e) { d('Error gathered in catch: %s', e); } d('END: gen'); } let afn = asyncify(gen); afn().then( function () { d('END'); }).catch( function (e) { d('END with error: %s', e); }); process.on('unhandledRejection', (err, promise) => { console.error('unhandledRejection: %s', err); });