Ответ 1
Дэвид Уолш имеет блог о генераторах ES6
У него есть пример
function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var it = foo( 5 );
// note: not sending anything into `next()` here
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // { value:42, done:true }
Но опять же, пример использования такой же, как и ваш пример.
В своем резюме он говорит
Естественно удивляться, что будет делать эта новая экзотическая игрушка практически для вашего кода. Однако им гораздо больше. У нас просто поцарапал поверхность. Поэтому нам нужно погрузиться глубже, прежде чем мы сможем узнайте, насколько мощными они могут быть/будут.
- Как работает обработка ошибок?
- Может ли один генератор вызвать другой генератор?
- Как работает асинхронное кодирование с генераторами?
Эти вопросы и многое другое будут рассмотрены в последующих статьях здесь, так что следите за обновлениями!
В более позднем блоге у него есть следующий фрагмент (и некоторые другие)
// run (async) a generator to completion
// Note: simplified approach: no error handling here
function runGenerator(g) {
var it = g(), ret;
// asynchronously iterate over generator
(function iterate(val){
ret = it.next( val );
if (!ret.done) {
// poor man "is it a promise?" test
if ("then" in ret.value) {
// wait on the promise
ret.value.then( iterate );
}
// immediate value: just send right back in
else {
// avoid synchronous recursion
setTimeout( function(){
iterate( ret.value );
}, 0 );
}
}
})();
}
runGenerator( function *main(){
var result1 = yield request( "http://some.url.1" );
var data = JSON.parse( result1 );
var result2 = yield request( "http://some.url.2?id=" + data.id );
var resp = JSON.parse( result2 );
console.log( "The value you asked for: " + resp.value );
} );
Что кажется немного более реальным миром.
Он суммирует
Проще говоря: генератор + дал обещание (-ы) сочетает в себе лучшее из обоих миры, чтобы получить действительно мощный и элегантный синхронизирующий (aslook) поток синхронизации управлять возможностями выражения. С помощью простых утилит обертки (которые многие библиотеки уже предоставляют), мы можем автоматически запускать наши генераторов до завершения, включая нормальную и синхронную ( "смотрящую" ) ошибку обработка!