Попытка `уступить` команде` co (fn) .call`

У меня проблема с возобновлением работы при изменении значения контекста:

var co = require( 'co' );

function *foo( next ){
    console.log( 'foo yielding' );
    yield next;
    console.log( 'foo yielded' );

    return 42;
}

var bar = co( function *(){
    console.log( 'bar yielding' );

    // this is the bit that I'm having problems with
    yield function( cb ){    
        return co( foo ).call(
              { name: 'this object' }
            , function(){ console.log( 'in next' ); }
            , cb
        );
    };

    console.log( 'bar yielded' );
} );

bar();

Вышеуказанные журналы:

bar yielding
foo yielding
in next

Я пробовал обернуть строку co( foo ).call функцией, функцией генератора и множеством других вещей. Я не могу заставить его работать ... помогите!

Обратите внимание, что если я обычно вызываю co, он работает. Но тогда я не могу установить контекст или передать аргументы функции, которую пытаюсь вызвать:

yield co( foo );

person Mark Kahn    schedule 20.02.2014    source источник


Ответы (2)


Моей следующей функции нужен обратный вызов, и она должна его выполнить:

, function( cb ){ console.log( 'in next' ); cb(); }

иначе цепочка остановится, ага

person Mark Kahn    schedule 20.02.2014

Не совсем понятно, чего вы пытаетесь достичь, но я предполагаю, что вы хотите увидеть

bar yielding
foo yielding
in next
foo yielding
bar yielding

Попробуйте этот код:

var co = require( 'co' );

function *foo( next ){
    console.log( 'foo yielding' );
    yield next;
    console.log( 'foo yielded' );

    return 42;
}

var bar = co( function *(){
    console.log( 'bar yielding' );

    // this is the bit that I'm having problems with
    yield co( foo ).bind(
              { name: 'this object' }
            , function(cb){ console.log( 'in next, name: ' + this.name ); process.nextTick(cb) }
        );

    console.log( 'bar yielded' );
} );

bar();

Пара сносок:

  • если вы передаете функцию, она должна быть преобразователем, то есть принимает один аргумент, и это обратный вызов;
  • вам нужно вызвать этот обратный вызов, также неплохо сделать это асинхронно;

Применяя это к вашему коду: - вы передаете функцию, но никогда не вызываете ее cb аргумент; - то же с next.

person vkurchatkin    schedule 20.02.2014