如何在RxJS中使用节点漫游?

如何在RxJS中使用节点漫游?,rxjs,directory-walk,node-walk,Rxjs,Directory Walk,Node Walk,提供一个包含以下事件的API walker.on('file', (root, filestats, next) => { // next should be called to goto next file next(); }); walker.on('end', () => { // the end of the stream }); 如果从订户调用函数通知源转到流中的下一项,是否为反应式?事件不会等待订阅者对其作出反应,对吗 如何将其转换为可观测的接收?尝试: 最

提供一个包含以下事件的API

walker.on('file', (root, filestats, next) => {
  // next should be called to goto next file
  next();
});
walker.on('end', () => {
  // the end of the stream
});
如果从
订户
调用函数通知
转到流中的下一项,是否为反应式?事件不会等待订阅者对其作出反应,对吗

如何将其转换为可观测的接收?

尝试:


最好是在其周围创建一个包装:

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))
    );
  });
};

我相应地更新了您的

我缺少什么?@BoopathiRajaa似乎需要使用
walker
作为上下文调用回调。因此,可以使用
bind
或提供
walker
作为
fromCallback
的第二个参数,这是有效的。但问题是,我猜回调只触发一次。因此,只有第一个找到的项被解析,并立即完成。
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))
    );
  });
};