2017-01-16 33 views
0

是否有像Promise.resolve()這樣的Rx運算符,其中 可以將可觀察值或普通值解析爲普通值?類似的可觀察運算符Promise.resolve()

例如,我可以這樣做:

Promise.resolve(3) 
.then(function(val){ 
    console.log('val => ',val); 
}); 

,當然還有,Promise.resolve()將接受一個承諾以及

但是,我很難找到一個類似的Rx運營商, 類似:

Rx.Observable.merge(3) 
.do(function(val){ 
     console.log('val => ',val); 
    }) 
.subscribe() 

除了Rx.Observable.merge不會接受所有的值,並會失敗,因爲以上。

Rx.Observable.of(3) 
    .map(v => { 
     console.log('val => ', v); 
    }) 
    .subscribe(); 

上面會接受一個數字,但如果你通過一個Observable,它不會解開Observable。

老實說,這是非常令人沮喪,這是如此難以確定。擁有這樣一種方法/功能將允許更靈活的代碼,因爲你可以重構代碼來返回非可觀察對象,它仍然可以工作。

這是迄今爲止我已經得到最接近:

// creates an Observable from anything, which can be unwrapped 
Rx.Observable.any = function (val) { 

    if (!(val instanceof Rx.Observable)) { 
     val = Rx.Observable.of(val); 
    } 

    return val; 

}; 

我們可以像這樣測試它:

Rx.Observable.any([1, 2, 3]) 
    .map(v => { 
     console.log('val => ', v); 
    }) 
    .subscribe(); 

Rx.Observable.any('abc') 
    .map(v => { 
     console.log('val => ', v); 
    }) 
    .subscribe(); 

Rx.Observable.any(4) 
    .map(v => { 
     console.log('val => ', v); 
    }) 
    .subscribe(); 


Rx.Observable.any(Rx.Observable.timer(100)) 
    .map(v => { 
     console.log('val => ', v); 
    }) 
    .subscribe(); 

,但我正在尋找一個更規範的方式做到這一點?

回答

1

正如你在你的問題指出,有Observable.fromObservable.of

Observable.from需要一個參數,它可以是一個observable,一個promise或一個數組(或者一個可迭代或類似數組的對象),並且返回一個observable - 數組值分別發出。

Observable.of接受一個參數將被髮射的值。

不像承諾,有適合所有目的沒有單一的政策 - 例如,有一些與自己發出觀測觀測工作的運營商。承諾並不是一個問題,因爲它可能是承諾,也可能不是 - 對於一個承諾去解決另一個承諾是沒有多大意義的。

如果您可以制定適合您的策略,那麼使用Observable.fromObservable.of編寫您自己的函數應該非常簡單。你需要決定的第一件事是你將如何處理數組:你想要一個可以發射數組本身或者單獨發射數組值的observable?

+0

謝謝,在這種情況下,天真的答案是隻返回數組,而不是分別發出值。在我的問題中,我將Promise.resolve()與promise的整個企業混爲一談,然後在返回值上調用Promise.resolve,然後返回一個新的承諾。有點令人困惑,但我認爲你明白了。 –

+0

這使得你的'Observable.any'實現稍微複雜一些,因爲你需要測試數組,數組類,iterables或'Observable.from'會將它們變成發射單獨值的觀察值。 – cartant

+0

是的,與你提到的陣列的事情,這將弄亂我的Rx.Observable.any方法,所以我回到了一個 –