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?










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?










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?










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?







rxjs ngrx rxjs5 rxjs6 ngrx-store






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 16 '18 at 18:13







Guido Dizioli

















asked Nov 13 '18 at 14:06









Guido DizioliGuido Dizioli

168111




168111













  • 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


















2














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











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









2














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
















2














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














2












2








2







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

43.4k1187131




43.4k1187131













  • 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



















  • 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

















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


















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

Full-time equivalent

さくらももこ

13 indicted, 8 arrested in Calif. drug cartel investigation