RxJS 6 / When does tap operator emit a value
I've been wondering if it's safe to assume that after the using the tap operator, the side effect inside it has completed.
My use case is with ngrx.
...
tap(() =>
this.store.dispatch(new SetValue("Hello World"));
}),
switchMap(() => this.store),
select(state => state.value),
tap(state =>
if (state === undefined)
throw new Error("Couldn't find value");
)
SetValue is an class that implements ngrx
export class SetValue implements Action
readonly type = SET_VALUE;
constructor(public payload: string)
What I'm trying to implement is to set a value on the store and then check if it's effectively been set.
Can I assume the dispatch has completed after tap operator?
Answer
I used this on Angular Router guards to set initial state by the parameters on the url, so I ended up filtering to only continue when the store has new value
...
tap(() => this.store.dispatch(new SetValue("Hello World"))),
switchMap(() => this.store),
select(state => state.value),
filter(value => value === "Hello World"),
take(1)
rxjs ngrx rxjs5 rxjs6 ngrx-store
add a comment |
I've been wondering if it's safe to assume that after the using the tap operator, the side effect inside it has completed.
My use case is with ngrx.
...
tap(() =>
this.store.dispatch(new SetValue("Hello World"));
}),
switchMap(() => this.store),
select(state => state.value),
tap(state =>
if (state === undefined)
throw new Error("Couldn't find value");
)
SetValue is an class that implements ngrx
export class SetValue implements Action
readonly type = SET_VALUE;
constructor(public payload: string)
What I'm trying to implement is to set a value on the store and then check if it's effectively been set.
Can I assume the dispatch has completed after tap operator?
Answer
I used this on Angular Router guards to set initial state by the parameters on the url, so I ended up filtering to only continue when the store has new value
...
tap(() => this.store.dispatch(new SetValue("Hello World"))),
switchMap(() => this.store),
select(state => state.value),
filter(value => value === "Hello World"),
take(1)
rxjs ngrx rxjs5 rxjs6 ngrx-store
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14
add a comment |
I've been wondering if it's safe to assume that after the using the tap operator, the side effect inside it has completed.
My use case is with ngrx.
...
tap(() =>
this.store.dispatch(new SetValue("Hello World"));
}),
switchMap(() => this.store),
select(state => state.value),
tap(state =>
if (state === undefined)
throw new Error("Couldn't find value");
)
SetValue is an class that implements ngrx
export class SetValue implements Action
readonly type = SET_VALUE;
constructor(public payload: string)
What I'm trying to implement is to set a value on the store and then check if it's effectively been set.
Can I assume the dispatch has completed after tap operator?
Answer
I used this on Angular Router guards to set initial state by the parameters on the url, so I ended up filtering to only continue when the store has new value
...
tap(() => this.store.dispatch(new SetValue("Hello World"))),
switchMap(() => this.store),
select(state => state.value),
filter(value => value === "Hello World"),
take(1)
rxjs ngrx rxjs5 rxjs6 ngrx-store
I've been wondering if it's safe to assume that after the using the tap operator, the side effect inside it has completed.
My use case is with ngrx.
...
tap(() =>
this.store.dispatch(new SetValue("Hello World"));
}),
switchMap(() => this.store),
select(state => state.value),
tap(state =>
if (state === undefined)
throw new Error("Couldn't find value");
)
SetValue is an class that implements ngrx
export class SetValue implements Action
readonly type = SET_VALUE;
constructor(public payload: string)
What I'm trying to implement is to set a value on the store and then check if it's effectively been set.
Can I assume the dispatch has completed after tap operator?
Answer
I used this on Angular Router guards to set initial state by the parameters on the url, so I ended up filtering to only continue when the store has new value
...
tap(() => this.store.dispatch(new SetValue("Hello World"))),
switchMap(() => this.store),
select(state => state.value),
filter(value => value === "Hello World"),
take(1)
rxjs ngrx rxjs5 rxjs6 ngrx-store
rxjs ngrx rxjs5 rxjs6 ngrx-store
edited Mar 12 at 17:10
Guido Dizioli
asked Nov 13 '18 at 14:06
Guido DizioliGuido Dizioli
217413
217413
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14
add a comment |
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14
add a comment |
1 Answer
1
active
oldest
votes
Most operations in RxJS are synchronous so if this.store.dispatch(new SetValue("Hello World"))
won't do any async task it probably will work as expected (it's still just a Subject under the hood).
However, you shouldn't rely on this behavior. NgRx might change it's internals and in general it's better not to rely on synchronicity/asynchronicity of RxJS operators (this has already happened in the past in eg. from()
from RxJS 4 to RxJS 5).
If you want to make sure something has been set then change your new SetValue("Hello World")
effect to emit another action after it's done doing what it needs to do.
SetValue is a class that implements action from ngrx, how does your suggestion fit in?export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handlingSetValue
action you map it to another action telling you thatSetValue
has finished.
– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282811%2frxjs-6-when-does-tap-operator-emit-a-value%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Most operations in RxJS are synchronous so if this.store.dispatch(new SetValue("Hello World"))
won't do any async task it probably will work as expected (it's still just a Subject under the hood).
However, you shouldn't rely on this behavior. NgRx might change it's internals and in general it's better not to rely on synchronicity/asynchronicity of RxJS operators (this has already happened in the past in eg. from()
from RxJS 4 to RxJS 5).
If you want to make sure something has been set then change your new SetValue("Hello World")
effect to emit another action after it's done doing what it needs to do.
SetValue is a class that implements action from ngrx, how does your suggestion fit in?export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handlingSetValue
action you map it to another action telling you thatSetValue
has finished.
– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
add a comment |
Most operations in RxJS are synchronous so if this.store.dispatch(new SetValue("Hello World"))
won't do any async task it probably will work as expected (it's still just a Subject under the hood).
However, you shouldn't rely on this behavior. NgRx might change it's internals and in general it's better not to rely on synchronicity/asynchronicity of RxJS operators (this has already happened in the past in eg. from()
from RxJS 4 to RxJS 5).
If you want to make sure something has been set then change your new SetValue("Hello World")
effect to emit another action after it's done doing what it needs to do.
SetValue is a class that implements action from ngrx, how does your suggestion fit in?export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handlingSetValue
action you map it to another action telling you thatSetValue
has finished.
– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
add a comment |
Most operations in RxJS are synchronous so if this.store.dispatch(new SetValue("Hello World"))
won't do any async task it probably will work as expected (it's still just a Subject under the hood).
However, you shouldn't rely on this behavior. NgRx might change it's internals and in general it's better not to rely on synchronicity/asynchronicity of RxJS operators (this has already happened in the past in eg. from()
from RxJS 4 to RxJS 5).
If you want to make sure something has been set then change your new SetValue("Hello World")
effect to emit another action after it's done doing what it needs to do.
Most operations in RxJS are synchronous so if this.store.dispatch(new SetValue("Hello World"))
won't do any async task it probably will work as expected (it's still just a Subject under the hood).
However, you shouldn't rely on this behavior. NgRx might change it's internals and in general it's better not to rely on synchronicity/asynchronicity of RxJS operators (this has already happened in the past in eg. from()
from RxJS 4 to RxJS 5).
If you want to make sure something has been set then change your new SetValue("Hello World")
effect to emit another action after it's done doing what it needs to do.
answered Nov 13 '18 at 14:13
martinmartin
46.3k1193137
46.3k1193137
SetValue is a class that implements action from ngrx, how does your suggestion fit in?export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handlingSetValue
action you map it to another action telling you thatSetValue
has finished.
– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
add a comment |
SetValue is a class that implements action from ngrx, how does your suggestion fit in?export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handlingSetValue
action you map it to another action telling you thatSetValue
has finished.
– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
SetValue is a class that implements action from ngrx, how does your suggestion fit in?
export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
SetValue is a class that implements action from ngrx, how does your suggestion fit in?
export class SetValue implements Action readonly type = SET_VALUE; constructor(public payload: string)
– Guido Dizioli
Nov 13 '18 at 14:35
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handling
SetValue
action you map it to another action telling you that SetValue
has finished.– martin
Nov 13 '18 at 14:39
You probably handle this action in another effect because I guess you don't create an action that does nothing. So when it's done handling
SetValue
action you map it to another action telling you that SetValue
has finished.– martin
Nov 13 '18 at 14:39
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
I'm editing the question to a the real world problem. I'm trying to provide values on store with a RouteGuard based on the url. That is where the action dispatch. I'd like to check that values have been succesfully filled in the store, otherwise redirect to another page
– Guido Dizioli
Nov 13 '18 at 14:43
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Adding to what @martin said, the ngrx also recommends us to same. Have Success/Fail action emitted based on the Load/Set Action. Then you can listen to loaded/error states updated by Success/Fail action and decide on navigating away.
– KiraAG
Nov 14 '18 at 5:47
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
Just for completness, I ended up filtering (rxjs filter operator) next to tap, assuring the store changed the value.
– Guido Dizioli
Mar 12 at 17:03
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282811%2frxjs-6-when-does-tap-operator-emit-a-value%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
I was thinking about my code too imperativly, my suggestion to any one encoutering this, is to encourage reactive programming, thinking about steams and when it sends data
– Guido Dizioli
Nov 16 '18 at 18:14