2017-11-01 10 views
0

Ich benutze angular 2 mit redux/store zusammen mit redux-observable, um Epen zu bilden. Was ich machen möchte, ist ein allgemeiner Poller, also muss ich nur einmal einen Poller schreiben. Ich habe etwa 25 Dienste und ich würde eher in welcher Art von Aktionen die Aktion Pass hat, und Dienstleistungen werden es ausführen dann den doppelten Code mit und schrieben großen Fall oder wenn Aussagen:Wie man ein EPIC komplett dynamisch macht

Code ich habe bisher:

startPoller: Epic<Action<void>, Action<void>> = action$ => 
    action$.ofType(BankActions.DEPOSIT.POLL_DATA) 
     .switchMap(action => 
     Observable.interval(1000) 
      .takeUntil(action$.ofType(BankActions.DEPOSIT.STOP_POLLING)) 
      .mergeMap(count => 
      this.bankService.getDeposit.(action.payload) 
       .map(payload => ({ type: BankActions.DEPOSIT.POLL_SUCCESS, payload })) 
       .catch(error => Observable.of({ 
       type: BankActions.DEPOSIT.POLLING_FAILED, 
       payload: error 
       })) 
     ) 
) 

Was ich will, in Pseudo-Code tun:

startPoller: Epic<Action<void>, Action<void>> = action$ => 
    action$.ofType(BankActions.DEPOSIT.POLL_DATA || BankActions.WITHDRAW.POLL_DATA || InvestActions.STOCK_PRICE.POLL_DATA) 
     .switchMap(action => 
     Observable.interval(1000) 
      .takeUntil(action$.ofType(action.STOP_POLLING)) 
      .mergeMap(count => 
      this.bankService.getDeposit(action.payload) 
       .map(payload => ({ type: BankActions.DEPOSIT.POLL_SUCCESS, payload })) 
       .catch(error => Observable.of({ 
       type: BankActions.DEPOSIT.POLLING_FAILED, 
       payload: error 
       })) 
     ) 
) 

ich vermute, es zu haben, arbeiten muss ich könnte irgendeine Art von Basistyp machen, dass jede Aktion/Service, den Bedarf zu abzufragen braucht würde verlängern dann könnte ich einfach prüfen, ob ifs vom Typ 'PollerService' oder 'PollerEpic' eingeben d dann kann ich das filtern?

Antwort

0

Es ist ein bisschen unklar, was Sie fragen, aber ich denke, ich kann ein paar Dinge beantworten.

Ihre Pseudo-Code ofType:

action$.ofType(BankActions.DEPOSIT.POLL_DATA || BankActions.WITHDRAW.POLL_DATA || InvestActions.STOCK_PRICE.POLL_DATA) 

Können, indem sie als Argumente erreicht werden; ofType überprüft, ob eine bestimmte Aktion einen dieser Typen aufweist.

action$.ofType(BankActions.DEPOSIT.POLL_DATA, BankActions.WITHDRAW.POLL_DATA, InvestActions.STOCK_PRICE.POLL_DATA) 

Das nächste, was in Ihrem Pseudo-Code, den ich sehe, ist, dass Sie die abgestimmte Aktion wollen bieten, was STOP_POLLING Typ.

.takeUntil(action$.ofType(action.STOP_POLLING)) 

Es ist unklar, was für STOP_POLLING Werte akzeptabel sind, in der Regel redux Typ Variablen die gleiche wie die Zeichenfolge benannt werden sollte z.B. STOP_POLLING = 'STOP_POLLING' In diesem Fall wäre es egal, wie sie alle gleich 'STOP_POLLING' Wert wären.

Wenn Sie sie variieren wollen, würde ich nicht die UPPER_CASE Konvention verwenden, dazu führen, dass es verwirrend machen könnte zu halten:

// what an action _might_ look like 
{ 
    type: BankActions.DEPOSIT.POLL_DATA, 
    meta: { 
    stopType: 'DEPOSIT_STOP_POLLING' 
    } 
} 

// then used something like this: 
.takeUntil(action$.ofType(action.meta.stopType)) 
Verwandte Themen