2017-01-16 107 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方法,所以我回到了一个 –