Created
February 22, 2017 03:27
-
-
Save Flash3001/e33efa3b28dfe1296777126705cfe817 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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