2016-11-03 1 views
2

Ich benutze Redux-Observable, um als die Middleware zwischen Dispatch-Aktionen und dem Geschäft zu fungieren. Ich versuche, die rxjs sample Funktion zu verwenden, um dies zu erreichen, aber leider funktioniert es nicht für mich. Hier ist mein Epos:Verwenden von Rxjs-Beispiel innerhalb von Redux-Observable, um andere Aktionen zu hören

export const inviteUserEpic = (action$) => { 
    return action$.ofType(a.INVITE_USER) 
    .flatMap(({ body }) => { 
     return Observable.concat(
      Observable.of({ type: authActions.REGISTER_REQ, body }), 
      Observable.of(push(`/team/${body.teamId}`)) 
      .sample(action$.ofType(authActions.REGISTER_SUCCESS)) 
     ); 
    }); 
}; 

Grundsätzlich ist die Idee, dass es mehrere Orte, um einen neuen Benutzer zu registrieren, und in diesem Fall mag ich die Teamseite umgeleitet, nachdem ich erfolgreich die Benutzer registrieren. Ich sehe REGISTER_REQ emittieren, und es wird anschließend REGISTER_SUCCESS ausgeben. Die Umleitungsbeobachtung wird jedoch nie abgetastet.

Antwort

2

Dies liegt daran, dass der Operator sample nur aktiv ist und den Notifier abonniert, wenn die Quelle selbst noch aktiv ist. In diesem Fall ist die Quelle eine Observable.of(), die die angegebene Aktion ausgibt und dann sofort complete(), was bedeutet, dass Sie nichts mehr probieren werden - es ist bereits complete() bevor Ihre REGISTER_SUCCESS Aktion ausgelöst wird. d.h. .sample() verhindert nicht, dass eine beobachtbare Kette vervollständigt wird.

Stattdessen sollten Sie mit der Übereinstimmung der erwarteten Aktion beginnen und dann, wenn übereinstimmend, diese auf Ihre push() zuordnen. Sie wollen wahrscheinlich auch nur für REQUEST_SUCESS einmal hören, nicht auf unbestimmte Zeit, so dass Sie ein .take(1) hinzufügen müssen, um

action$.ofType(authActions.REGISTER_SUCCESS) 
    .take(1) 
    .map(() => push(`/team/${body.teamId}`)) 

dass Putting zusammen mit Ihrem vorhandenen Epische

export const inviteUserEpic = (action$) => { 
    return action$.ofType(a.INVITE_USER) 
    .flatMap(({ body }) => { 
     return Observable.concat(
      Observable.of({ type: authActions.REGISTER_REQ, body }), 
      action$.ofType(authActions.REGISTER_SUCCESS) 
       .take(1) 
       .map(() => push(`/team/${body.teamId}`)) 
     ); 
    }); 
}; 

Sie ein funktionierendes Beispiel sehen können hier dafür: http://jsbin.com/sonuqob/edit?js,output

+0

@Jake Dluhy habe ich vergessen zu erwähnen, dass Sie wahrscheinlich für immer nicht für 'REGISTER_SUCCESS' hören wollen, in diesem Fall sollten Sie eine' .take (1) in ', so dass es nach dem ersten vollendet Spiel. Ich habe meine Antwort entsprechend bearbeitet. – jayphelps

+0

Danke! Eine andere Sache, an die ich dachte, ist, die Umleitung abzubrechen, wenn die Anfrage fehlschlägt. Ich habe '.takeUntil (action $ .ofType (authActions.REGISTER_FAILURE))' hinzugefügt, was zu funktionieren scheint. –

+0

Ja, das ist perfekt. – jayphelps

Verwandte Themen