Skip to content

Instantly share code, notes, and snippets.

@Flash3001
Created February 22, 2017 03:27
Show Gist options
  • Save Flash3001/e33efa3b28dfe1296777126705cfe817 to your computer and use it in GitHub Desktop.
Save Flash3001/e33efa3b28dfe1296777126705cfe817 to your computer and use it in GitHub Desktop.
// helpers
function tryCatch(func, catcher) {
try {
func();
} catch (err) {
catcher(err);
}
};
function makePromise(time) {
return new Promise(function(resolve, reject) {
setTimeout(() => resolve(`Time spent: ${time}`), time);
});
};
// big deal!
function run(gen) {
var it = gen.apply(this, Array.prototype.slice.call(arguments, 1));
return new Promise(function (resolve, reject) {
(function go(next) {
var handle = f => tryCatch(f, err => Promise.resolve(err).then(o => reject(o), r => reject(r)));
Promise.resolve(next.value).then(
v => handle(() => next.done ? resolve(v) : go(it.next(v))),
err => handle(() => next.done ? reject(err) : go(it.throw(err))));
})(it.next());
});
};
function *generator(value) {
try {
console.log(`---------- ${value} ----------`);
console.log(yield makePromise(value * 5));
console.log(yield value * 7);
if (value >= 100) throw value;
if (value >= 10) yield Promise.reject("reject");
return "done";
} catch (err) {
if (value >= 60) {
yield Promise.reject(err);
} else if (value >= 30) {
throw err;
} else if (value >= 15) {
throw Promise.reject(`err: ${value}`);
} else {
return "it's ok";
}
}
};
// tests
function *test(num) {
try {
console.log(yield run(generator, num));
console.log(yield run(generator, 1));
console.log(yield "full test");
} catch (err) {
console.log(err);
console.log(yield "test catch");
}
}
// test runner...
function *testRunner() {
var nums = [ 100, 60, 30, 15, 10, 2 ];
for (i in nums) {
var num = Number(i) + 1;
console.log(yield `############# Test ${num} : START`);
yield run(test, nums[i]);
console.log(yield `############# Test ${num} : END`);
console.log();
}
}
run(testRunner).catch(err => console.log(err));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment