2015-05-23 9 views
1

Node walk представляет API с несколькими событиями, подобными этому.Как использовать узел-прогулку с RxJS?

walker.on('file', (root, filestats, next) => { 
    // next should be called to goto next file 
    next(); 
}); 
walker.on('end',() => { 
    // the end of the stream 
}); 

ли реактивным, если из subscriber вы вызываете функцию, чтобы сообщить source, чтобы перейти к следующему пункту в потоке? События не ждут, когда абонент отреагирует на это, не так ли?

Как преобразовать это в Rx Observable?

ответ

1

Лучше всего, чтобы создать оболочку вокруг него:

Rx.Observable.fromWalk = function(root, options, scheduler) { 
    scheduler = scheduler || Rx.Scheduler.currentThread; 

    return Rx.Observable.create(function(observer) { 
    var walker = walk.walk(root, options); 

    function fileHandler(x) { 
     observer.onNext({stats : x.stats, root : x.root}); 
     scheduler.scheduleWithState(x, function(s, i) { 
     i.next(); 
     }); 
    } 

    var files = Rx.Observable.fromEvent(walker, 'file', 
     function(arr) { 
     return { root : arr[0], stats : arr[1], next : arr[2] }; 
    }); 
    var ended = Rx.Observable.fromEvent(walker, 'end'); 

    return new Rx.CompositeDisposable(
     files.subscribe(fileHandler), 
     ended.subscribe(observer.onCompleted.bind(observer)) 
    ); 
    }); 
}; 

Я обновил ваш example соответственно

1

Попробуйте Rx.Observable.fromCallback:

var walkerOn = Rx.Observable.fromCallback(walker.on, walker) 
var source = walkerOn('file'); 
var subscription = source.subscribe(observer); 
+0

http://runnable.com/VWC95roUO3YLEN5t/ rx-walk-for-node-js-and-hello-world Что мне не хватает? –

+0

@BoopathiRajaa Похоже, что обратный вызов нужно вызвать с помощью 'walker' в качестве контекста. Поэтому либо используйте 'bind', либо укажите' walker' в качестве второго аргумента 'fromCallback'. – Mosho

+0

Это сработало. Но проблема в том, что я думаю, что обратный вызов запускается только один раз. Таким образом, разрешается только первый найденный элемент и немедленно завершается. –