2012-08-29 23 views
6

क्या आरएक्सजेएस के लिए निम्नलिखित कोई समाधान है? Is it possible to invoke subscribers's OnNexts on different threads in Rx?आरएक्सजेएस पर्यवेक्षण के लिए एकाधिक सदस्यता। अंतराल

पीएस मेरा पहला, अनुभवहीन दृष्टिकोण (CoffeeScript में) स्पष्ट रूप से विफल रहा था:

hObs = Rx.Observable.interval(35000) 
    .startWith(-1) 
    .select(moment().format("D MMMM, HH:mm:ss")) 
    .publish() 

hObs.subscribe((x)->console.log(x)) 
hObs.connect() 
hObs.subscribe((x)->console.log(x, 1)) 
hObs.connect() 

दूसरा सदस्यता 35s अंतराल के लिए कुछ भी नहीं देता है, और इतने

उत्तर

5

.select पर एक समारोह, नहीं एक मूल्य की उम्मीद है। निम्नलिखित काम करता है:

(function() { 
    var list = document.getElementById("list"); 
    var stream = Rx.Observable.interval(35000) 
    .startWith(-1) 
    .select(function(){ return moment().format("D MMMM, HH:mm:ss") }); 

    stream.subscribe(function(value) { 
     var li = document.createElement("li"); 
     li.innerHTML = "subscriber 1: "+value; 
     list.appendChild(li); 
    });  
    stream.subscribe(function(value) { 
     var li = document.createElement("li"); 
     li.innerHTML = "subscriber 2: "+value; 
     list.appendChild(li); 
    }); 
})(); 

http://jsfiddle.net/9EjSQ/43/

सूचना है कि आप connect() दो बार कॉल करने के लिए, आम तौर पर आप इसे केवल एक बार फोन की जरूरत नहीं है। अवलोकन श्रृंखला के अंत में .publish().refCount() पर कॉल करके "स्वचालित" connect() का उपयोग करना बेहतर है। इससे कनेक्ट करने योग्य ऑब्सर्जेबल बन जाएगा, दूसरे शब्दों में "गर्म अवलोकन" (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables देखें)। इस मामले में, हमें एक गर्म अवलोकन की आवश्यकता नहीं थी।

coffeescript में:

list = document.getElementById("list") 
stream = Rx.Observable.interval(35000) 
.startWith(-1) 
.select(-> moment().format("D MMMM, HH:mm:ss")) 

stream.subscribe((value) -> 
    li = document.createElement("li") 
    li.innerHTML = "subscriber 1: " + value 
    list.appendChild(li) 
) 
stream.subscribe((value) -> 
    li = document.createElement("li") 
    li.innerHTML = "subscriber 2: " + value 
    list.appendChild(li) 
) 

http://jsfiddle.net/9EjSQ/44/

संबंधित मुद्दे