RxJS 6 / When does tap operator emit a value










2















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)









share|improve this question
























  • 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















2















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)









share|improve this question
























  • 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













2












2








2








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)









share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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

















  • 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












1 Answer
1






active

oldest

votes


















3














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.






share|improve this answer























  • 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












  • 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










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
);



);













draft saved

draft discarded


















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









3














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.






share|improve this answer























  • 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












  • 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















3














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.






share|improve this answer























  • 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












  • 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













3












3








3







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.






share|improve this answer













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.







share|improve this answer












share|improve this answer



share|improve this answer










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 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











  • 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












  • 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











  • 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



















draft saved

draft discarded
















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)