Подтвердить что ты не робот

Использование в реальном времени двухсторонних генераторов в javascript

Исходя из мира С#, мне любопытно понять, что представляет собой практическое использование двухсторонних генераторов в javascript. Я могу понять, как генераторы могут быть полезны вообще, но не тогда, когда речь идет о двухходовых генераторах. Можем ли мы использовать его с RxJS или нравится? Можете ли вы объяснить любой шаблон/сценарий, где это можно использовать?

function* interrogate() {
   let name = yield "What is your name?";
   let color = yield "What is your favorite color?";
   return `${name} favorite color is ${color}.`;
}

let it = interrogate();
it.next();         // { value: "What is your name?", done: false }
it.next('Ethan');  // { value: "What is your favorite color?", done: false }
it.next('orange'); // { value: "Ethan favorite color is orange.", done:true }
4b9b3361

Ответ 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) поток синхронизации управлять возможностями выражения. С помощью простых утилит обертки (которые многие библиотеки уже предоставляют), мы можем автоматически запускать наши генераторов до завершения, включая нормальную и синхронную ( "смотрящую" ) ошибку обработка!