const delay = ms => new Promise((ok, neOk) => setTimeout(() => ok(ms), ms)) function run(gena) { let iter = gena() function next(promiseResult, error=false) { let a if (!error) { a = iter.next(promiseResult) } else { iter.throw(promiseResult) } if (a.value instanceof Promise) { a.value.then(result => next(result)).catch(e => next(e, true)) } } next() } function* check() { console.log(1) let result1 = yield delay(1000) console.log(result1) let result2 = yield delay(2000) console.log(result2) return 100500 } run(check)