Skip to content

Instantly share code, notes, and snippets.

@wtfil
Created June 17, 2014 12:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wtfil/a8e897f3bd737dc17659 to your computer and use it in GitHub Desktop.
Save wtfil/a8e897f3bd737dc17659 to your computer and use it in GitHub Desktop.
generators for async flow
var Promise = require('davy');
//get user as promise
function getUser() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve('user name');
}, 1000);
});
}
/**
* @param {GeneratorFunction} generator
*/
function runGenerator(generator, result) {
// first call
if (!result) {
generator = generator();
result = generator.next();
}
// generator ends
if (result.done) {
return;
}
// promise
if (result.value && result.value.then) {
result.value.then(function (value) {
runGenerator(generator, generator.next(value));
});
// not promise
} else {
runGenerator(generator, generator.next(result.value));
}
}
function* testGeneratorFunction() {
var a = yield 'a4';
console.log('a:', a);
var user = yield getUser();
console.log('user:', user);
}
@asci
Copy link

asci commented Jun 21, 2014

Кароч, я понял. runGenerator - это управляющая функция, которая управляет выполнением генератора и если елд генератора возвращает промис, то она продолжает выполнение генератора только после резолва промиса, а потом в следующий шаг уже засовывает значение резолвнутого промиса и выполняет генератор до следующего елда или до конца. Так?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment