Promise.resolve()

时间:2017-01-16 05:30:12

标签: javascript node.js rxjs5

是否有像Promise.resolve()这样的Rx运算符 可以将Observable或plain值解析为普通值吗?

例如,我可以这样做:

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 个答案:

答案 0 :(得分:1)

正如您在问题中所述,有Observable.fromObservable.of

Observable.from接受一个可观察,一个promise或一个数组(或一个可迭代或类似数组的对象)的参数,并返回一个observable - 数组值是单独发出的。

Observable.of接受一个参数,即要发出的值。

与承诺不同,没有一个单一的政策适合所有目的 - 例如,有些运营商使用自己发出可观察量的可观察量。承诺它不是一个问题,因为它既可以是承诺,也可能不是承诺 - 并且对于承诺解决另一个承诺没有多大意义。

如果您可以制定适合您的政策,编写使用Observable.fromObservable.of实施的自己的功能应该非常简单。您需要决定的第一件事是如何处理数组:您是否想要一个可以自己发出数组或者单独发出数组值的observable?