2015-05-23 12 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

工作。但問題是我想回調只被解僱一次。所以只有第一個找到的項目被解決,並立即完成。 –