Skip to content
This repository has been archived by the owner on Oct 1, 2018. It is now read-only.

docs(operators): add documentation for concatMap #272

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

luillyfe
Copy link
Contributor

No description provided.

@codecov-io
Copy link

codecov-io commented Feb 19, 2018

Codecov Report

❗ No coverage uploaded for pull request base (master@91a3918). Click here to learn what that means.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff            @@
##             master     #272   +/-   ##
=========================================
  Coverage          ?   79.62%           
=========================================
  Files             ?       17           
  Lines             ?      216           
  Branches          ?        9           
=========================================
  Hits              ?      172           
  Misses            ?       42           
  Partials          ?        2

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 91a3918...0598275. Read the comment docs.

// the MergeMap's project function is executed just on time!
$click.mergeMap(() => $interval,
(fromSource, fromInterval, iSource, IInterval) => fromInterval(iSource, IInterval))
.subscribe(console.log);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, could you add the expected output. Maybe take a look at the documentation guidelines. There are some tipps and tricks for documenting operators. Thanks for PR!!!

import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/mapTo';
import 'rxjs/add/operator/mergeMap';
const $click = Observable.fromEvent(document, 'click');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you use es6 import and pipe operator

const $interval = Observable.interval(3000)
.mapTo((iClick, IInterval) => Click(iClick), Interval(IInterval);
// the MergeMap's project function is executed just on time!
$click.mergeMap(() => $interval,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example should use concatMap. I can't find any concatMap in this example

these inner Observables using <a href="#/operators/concatAll">concatAll</a>.</span>`
},
walkthrough: {
description: `You have to be care of managing the subscriptions of inner Observables
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would add this as a warning in the short description. You could add a warning with the operatorextra object. LMK if you need some help!

Copy link
Member

@niklas-wortmann niklas-wortmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Collaborator

@btroncone btroncone left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution! Just a few comments / questions 👍

'operatorType': 'transformation'
name: 'concatMap',
operatorType: 'transformation',
signature: `concatMap(project: (value: T, index: number) => ObservableInput<I>,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we are going without generic signature, correct?

Copy link
Contributor Author

@luillyfe luillyfe Feb 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am changing to the not generic version. 👍

const $click = fromEvent(document, 'click');
const $interval = interval(3000)
.pipe(mapTo((iClick, iInterval) => 'Click('+iClick+')'+', '+'Interval('+iInterval+')'));
// the ConcatMap's project function is executed just one time!
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would update to:
concatMap's project function is executed just one time!

in a serialized fashion waiting for each one to complete before merging the next one
<span class="informal">Maps each value to an Observable, then flattens all of
these inner Observables using <a href="#/operators/concatAll">concatAll</a>.</span>`
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few updates:

Project each source value to an Observable which is then merged with the output observable in a serialized fashion. The previous subscription must complete before the next begins. Inner Observables are flattened using <a href="#/operators/concatAll">concatAll</a>.</span>

const $interval = interval(3000)
.pipe(mapTo((iClick, iInterval) => 'Click('+iClick+')'+', '+'Interval('+iInterval+')'));
// the ConcatMap's project function is executed just one time!
// Even if you make aditional cliks the ConcatMap's project function is not longer executed
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small typo, additional, clicks, no longer

is only executed once. the second parameter 'resultFunction', allows you to access to the index of
source observable and inner observable (besides the items)`
},
examples: [
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if a better starting example for concatMap would be showing delayed observables executing in order, after completion. Generally, questions I see about concatMap are about why you would want to use this vs mergeMap or switchMap. I think we need to emphasize the difference between these three in the primary examples. What do you all think? @sumitarora @ashwin-sureshkumar @ladyleet

Copy link
Contributor Author

@luillyfe luillyfe Feb 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I think this example could works to prove the singularity of concatMap:
with concatMap the project Function is executed just one time:
Click(0), Interval(0) -> Click(0), Interval(1) -> Click(0), Interval(2) etc

with mergeMap the project Function is executed every time I make a click (it could produce memory leaks):
Click(0), Interval(0) -> (click) Click(0), Interval(1) - Click(1), Interval(0) -> etc

with switchMap the project Function is executed every time I make a click but it ends the active subscription until switch to another observable:
Click(0), Interval(1) -> (click) Click(1), Interval(0) -> (click) Click(2), Interval(0)

Please check the live example, https://stackblitz.com/edit/concatmap?file=index.ts

Copy link

@jsonberry jsonberry Feb 27, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm 🤔 about this one. I think this example shows how concatMap works, but I'm not sure it would clearly show it's use versus mergeMap or switchMap, to a novice, like @btroncone mentioned.

The first time concatMap's use became apparent to me was when I saw ajax results being returned in order of pagination. I tried switching to a mergeMap and saw results returning out of order, because some paginated results were able to return faster than others. That's when concatMap clicked for me, as well as concurrency with mergeMap.

The example also uses a resultSelector function, and it looks like those are probably going to get the axe: ReactiveX/rxjs#3304 It might be best to omit them from examples on the docs here.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants