【问题标题】:RxJS5 Operator that can handle wrapped *and* unwrapped values?可以处理包装的 * 和 * 未包装的值的 RxJS5 运算符?
【发布时间】:2017-05-24 04:48:28
【问题描述】:

使用 Promises,如果你这样做:

    Promise.resolve(p).then(function(){
      return 5;
    })
   .then(function(val){
      return db.find(); // promise
    });

我们可以看到,promise 上的 then 操作符可以处理任何返回值,它只是在返回结果上调用 Promise.resolve() 并处理它是否是一个 promise。

但是,使用 RxJS5,我发现很难找到可以做类似事情的运算符。我收到很多错误:

TypeError: You provided x where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at Object.subscribeToResult (/home/oleg/WebstormProjects/oresoftware/observable-persistent-queue/node_modules/rxjs/util/subscribeToResult.js:73:27)
    at MergeAllSubscriber._next (/home/oleg/WebstormProjects/oresoftware/observable-persistent-queue/node_modules/rxjs/operator/mergeAll.js:85:42

例如,用这个:

Rx.Observable.range(1,9)
    .flatMap(function(){
        return Rx.Observable.timer(4)
    })
    .concatAll() // this will throw the error
    .subscribe();

是否有 RxJS 运算符或运算符模式可以处理任何值并像使用 Promises 一样解包?

【问题讨论】:

    标签: rxjs5 angular2-observables


    【解决方案1】:

    据我所知,没有任何操作员可以接受任何东西并且可以正常工作。 MergeMap/switchMap/concatMap 将使用 array/promises/observables 作为返回值并将它们转换为 Observable 流。但不是常规值。

    【讨论】:

    • 是的,我实际上认为这没什么大不了的,只是让某个调用能够处理 Observable 或普通值是半方便的;如果你真的想要,你可以创建一个我猜两者都处理的运算符
    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多