Whatever happened to `Observable.transduce` in RxJS v5+?

Kevin Ghadyani

RxJS v4 used to have an Observable.transduce method which took a transducer. This allowed the use of library-independent transducer operators which had major performance benefits in the past.

Sources

RxJS v5.5 and v6 have pipeable operators and v6 removed method chaining. Because of this, I assumed RxJS operators were standard transducers. Looking through the source code, that doesn't seem to be the case.

RxJS v6 operators function like a transducer where each value is passed entirely through the chain before the next value goes through, but RxJS v6 operators aren't using the standard transducer methods I've seen in other libraries meaning, I don't think they're portable.

The whole thing about transducers is they don't know anything about the collection itself. Instead of writing 100 operators specifically for observables, you could write 100 operators universally able to be applied to any collection or stream type.

Is .pipe unanimous with .transduce or was this method completely removed in RxJS v5?

user3743222

I had the exact same question and could not find the answer anywhere. Yes you can pipe, but I believe that would create intermediary observables for each operator. I don't know for sure though, it would be about reading the code.

So I came up with my own transduce operator :

function transformForObserver(o) {
  return {
    "@@transducer/init": function() {
      return o;
    },
    "@@transducer/step": function(obs, input) {
      return obs.next(input);
    },
    "@@transducer/result": function(obs) {
      return obs.complete();
    }
  };
}

    const transduce = (obs, transducer) => {
      const xform = transducer(transformForObserver);

      return Observable.create(o => {
        return obs.subscribe({
          next: x => {
            const res = tryCatch(
              xform["@@transducer/step"],
              err => {
                console.error(`Error occurred in transducer/step!`, err);
                return err;
              }
            )(xform, o, x);

            if (res instanceof Error) { o.error(res); }
          },
          error: err => {
            console.error(`Error occurred in observable passed to Rx transduce fn!`, err);
            o.error(err);
          },
          complete: () => {o.complete();}
        });
      });
    }

Haven't tested it yet, will post soon about it if there is interest.

Update : I forked jslongser's tranducers library and included such transducers in it. Fork is https://github.com/brucou/transducers.js, and the function is transduceLazyObservable. Cf. tests for example of use.

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RxJS v5で新しいObservable(function(observer){...をどのように返しますか?

分類Dev

In RxJS 5, is there a way to trigger an Observable before subscribing to it?

分類Dev

Observable of array with filter using Angular 5 with RxJS

分類Dev

Angular / RxJS Multicasting Observable of Observable

分類Dev

RxJS: Is there an no-op observable?

分類Dev

Convert Promise to RxJs Observable

分類Dev

Observable.fromEvent-RXJS

分類Dev

Rxjs append string to an observable?

分類Dev

Recursion and Observable RxJs

分類Dev

Observable rxjs filter

分類Dev

RxJS - Observable to a Model Object

分類Dev

RxJs Observable from backed with pulling

分類Dev

RxJS 5 Rx.Observable.timer(3000).mapTo({id:1})をRxJS 6に変換しますか?

分類Dev

What happened to RichTextBoxOverflow in Silverlight 5?

分類Dev

Angular2およびRxJS5 Observable.share()

分類Dev

Angular 5 / Typescript / RxJS-Observableからデータを取得します

分類Dev

RxJS v5:paramsを使用してPOSTリクエストを行う方法は?

分類Dev

Server 15.10 - "service whatever start" will not start 'whatever' system V init script in /etc/init.d/

分類Dev

Rxjs:Observable.combineLatestとObservable.forkJoin

分類Dev

RxJS:Observable.create()とObservable.from()

分類Dev

Observable 출력의 RxJS Observable 결과

分類Dev

Rxjs: create observable from value または observable

分類Dev

RxJS group by field and return new observable

分類Dev

Creating an RxJS Observable from a (server sent) EventSource

分類Dev

RXJS Observable Transform Array To Multiple Values

分類Dev

Rxjs observable wait until some condition is met

分類Dev

Use RxJs Pipe to reduce Observable to different type

分類Dev

rxjs observable debounceTime innernext無視

分類Dev

RxJs how to merge two overlapping observable into one

Related 関連記事

  1. 1

    RxJS v5で新しいObservable(function(observer){...をどのように返しますか?

  2. 2

    In RxJS 5, is there a way to trigger an Observable before subscribing to it?

  3. 3

    Observable of array with filter using Angular 5 with RxJS

  4. 4

    Angular / RxJS Multicasting Observable of Observable

  5. 5

    RxJS: Is there an no-op observable?

  6. 6

    Convert Promise to RxJs Observable

  7. 7

    Observable.fromEvent-RXJS

  8. 8

    Rxjs append string to an observable?

  9. 9

    Recursion and Observable RxJs

  10. 10

    Observable rxjs filter

  11. 11

    RxJS - Observable to a Model Object

  12. 12

    RxJs Observable from backed with pulling

  13. 13

    RxJS 5 Rx.Observable.timer(3000).mapTo({id:1})をRxJS 6に変換しますか?

  14. 14

    What happened to RichTextBoxOverflow in Silverlight 5?

  15. 15

    Angular2およびRxJS5 Observable.share()

  16. 16

    Angular 5 / Typescript / RxJS-Observableからデータを取得します

  17. 17

    RxJS v5:paramsを使用してPOSTリクエストを行う方法は?

  18. 18

    Server 15.10 - "service whatever start" will not start 'whatever' system V init script in /etc/init.d/

  19. 19

    Rxjs:Observable.combineLatestとObservable.forkJoin

  20. 20

    RxJS:Observable.create()とObservable.from()

  21. 21

    Observable 출력의 RxJS Observable 결과

  22. 22

    Rxjs: create observable from value または observable

  23. 23

    RxJS group by field and return new observable

  24. 24

    Creating an RxJS Observable from a (server sent) EventSource

  25. 25

    RXJS Observable Transform Array To Multiple Values

  26. 26

    Rxjs observable wait until some condition is met

  27. 27

    Use RxJs Pipe to reduce Observable to different type

  28. 28

    rxjs observable debounceTime innernext無視

  29. 29

    RxJs how to merge two overlapping observable into one

ホットタグ

アーカイブ