ã¯ããã«
ææ°ã®ãªã³ã©ã€ã³ãã³ãã³ã°ã·ã¹ãã ã®èšèšã¯ãããªãè€éãªäœæ¥ã§ãã åæã«ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåãéçºããããã®å€ãã®ã¿ã¹ã¯ã¯ãããã€ãã®æ å ±æºããã»ãŒåæã«æ¥ã倧éã®ããŒã¿ã®åŠçã«é¢é£ããŠããŸãã ãªã¢ãŒããã³ãã³ã°ã·ã¹ãã ïŒRBSïŒãã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãããŸããŸãªæ å ±ãµãŒãã¹ããã®ããŒã¿ãããã§ãªã¢ã«ã¿ã€ã ã«åä¿¡ããŠåŠçããå¿ èŠããããŸãã ãã®çš®ã®åé¡ã解決ããããã«ã仿¥ã§ã¯ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ææ³ãåºã䜿çšãããŠããŸãã
åºçŸ©ã®ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ããšããçšèªã¯ãããŒã¿ã¹ããªãŒã ã®ç¶æ ãåŠçããçµæãšããŠã·ã¹ãã ã®å€æŽã®äŒæãçºçãããã¢ããªã±ãŒã·ã§ã³ã®ãã®ãããªç·šæãæå³ããŸãã ãã®æ¹æ³ã®éèŠãªåé¡ã¯ãæ å ±ãããŒã®æç€ºã®åçŽããšãæç€ºçµæã®éåæåŠçäžã«çºçãããšã©ãŒã«å¯Ÿå¿ããå¯èœæ§ã§ãã
çãæå³ã§ã¯ããªã¢ã¯ãã£ãWeb UIããã°ã©ãã³ã°ã¯ãRxJsã©ã€ãã©ãªãªã©ã®æ¢è£œã®éçºè ããŒã«ã䜿çšããããšãæå³ããŸãã ãã®ã©ã€ãã©ãªã¯ãObservableãªããžã§ã¯ãã䜿çšããŠããŒã¿ã·ãŒã±ã³ã¹ã®é¢æ£è¡šçŸãæäŸããŸããããã¯ãç¹å®ã®ééã§ã¢ããªã±ãŒã·ã§ã³ã«å ¥åãããæ å ±ã®ãœãŒã¹ãšããŠæ©èœããŸãã
äžå°äŒæ¥åãã®ãªã³ã©ã€ã³ãã³ã¯ã®Webã€ã³ã¿ãŒãã§ã€ã¹ãèšèšããäŸã§ãã©ã€ãã©ãªã䜿çšããæ©èœãæ€èšããŠãã ããã UIãéçºããéãçµã¿èŸŒã¿ã®RxJsã©ã€ãã©ãªããŒãžã§ã³6ãåããGoogle Angular 6ãã©ãããã©ãŒã ã䜿çšããŸããã
ãªã¢ã¯ãã£ãUIãã¶ã€ã³ã¿ã¹ã¯
ãŠãŒã¶ãŒã«ãšã£ãŠãã€ã³ã¿ãŒããããã³ãã³ã°ã®ã»ãšãã©ã®æäœã¯ãå€ãã®å Žå3ã€ã®æ®µéã«åããããŸãã
- ãªã¹ãããå¿ èŠãªæäœãéžæããŸããããšãã°ãããŒã³ã®è¿æžãå£åº§ã®è£å ã
- 察å¿ãããã©ãŒã ã®éšåçãªèšå ¥ïŒæ¯æãã®è©³çްã¯ãçµç¹ã®ååãŸãã¯ãŠãŒã¶ãŒãå ¥åããåå人ã®ååã«ãã£ãŠèªåçã«å ¥åãããŸãïŒ;
- SMSã¡ãã»ãŒãžãŸãã¯é»å眲åã䜿çšããæäœã®èªå確èªã
éçºè ã®èгç¹ããããããã®æ®µéã®å®è£ ã«ã¯ã次ã®ã¿ã¹ã¯ã®ãœãªã¥ãŒã·ã§ã³ãå«ãŸããŸãã
- RBSã·ã¹ãã ã®ã¹ããŒã¿ã¹ããã§ãã¯ãããªã¹ãå ã®æäœã«é¢ããããŒã¿ã®é¢é£æ§ã確èªããŸãã
- ãŠãŒã¶ãŒãå ¥åããæ å ±ã¡ãã»ãŒãžãµãŒãã¹ïŒéè¡ã®ååãTINãBICãªã©ïŒããåä¿¡ããããŒã¿ãå«ãããã©ãŒã ãžã®å ¥åæã®ããŒã¿ãããŒã®éåæåŠçã
- 宿ãããã©ãŒã ã®æ€èšŒ;
- ãã©ãŒã å ã®ããŒã¿ã®èªåä¿åã
RBSã·ã¹ãã ã®ã¹ããŒã¿ã¹ã®ç¢ºèª
RBã·ã¹ãã ããé¢é£ããŒã¿ãååŸããããã»ã¹ãããšãã°ãã¯ã¬ãžããã©ã€ã³ãæ¯æãæ³šæã®ã¹ããŒã¿ã¹ã«é¢ããæ å ±ã«ã¯ã2ã€ã®æ®µéããããŸãã
- ããŒã¿ã®å¯çšæ§ã¹ããŒã¿ã¹ã®ç¢ºèªã
- æŽæ°ãããããŒã¿ãåä¿¡ããŸãã
ããŒã¿ã®çŸåšã®ç¶æ ã確èªããããã«ãäžå®ã®æéãããã³ããŒã¿ã®æºåç¶æ³ã«é¢ããå¿çãåä¿¡ãããŸã§ãã·ã¹ãã ã®APIã«å¯ŸããŠã¯ãšãªãå®è¡ãããŸã
RBã·ã¹ãã ã«ã¯ããã€ãã®å¯èœãªçãããããŸãã
- {emptyïŒtrue}-ããŒã¿ã¯ãŸã æºåãã§ããŠããŸããã
- ã¯ã©ã€ã¢ã³ãã¯æŽæ°ãããããŒã¿ãåä¿¡ã§ããŸãã
{ empty: false // - }
- ééãã
ãã®çµæãé¢é£ããŒã¿ã¯æ¬¡ã®åœ¢åŒã§ååŸãããŸãã
const MIN_TIME = 2000; const MAX_TIME = 60000; const EXP_BASE = 1.4; request() // .pipe( expand((response, index) => { const delayTime = Math.min(MIN_TIME * Math.pow(EXP_BASE, index), MAX_TIME); return response.empty ? request().pipe(delay(delayTime)) : EMPTY; }), last() ) .subscribe((response) => { /** - */ });
段éçã«åæããŸãããïŒ
- ãªã¯ãšã¹ããéä¿¡ããŸãã ãªã¯ãšã¹ãïŒïŒ
- çãã¯æ¡å€§ããŸãã Expandã¯ãã¹ã¬ãããæ£åžžã«å®äºããããšãå ±åãããŸã§ãå éšããã³å€éšObservableã®æ¬¡ã®ã¢ã©ãŒãããšã«ããããã¯å ã®ã³ãŒããååž°çã«ç¹°ãè¿ãRxJSã¹ããŒãã¡ã³ãã§ãã ãããã£ãŠãã¹ããªãŒã ãå®äºããã«ã¯ã次ã®åäžã®EMPTYãååšããªãããã«ããã®ãããªObservableãè¿ãå¿ èŠããããŸãã
- å¿çã{emptyïŒtrue}ã®å Žåãäžå®ã®æéé å»¶ïŒdelayTimeïŒã®åŸã«2çªç®ã®èŠæ±ãè¡ããŸãã ãµãŒããŒããªã¯ãšã¹ãã§éè² è·ã«ãªããªãããã«ãæ°ãããªã¯ãšã¹ãããšã«pingã®æéééãå¢ãããŸãã
- 次ã®ãªã¯ãšã¹ãäžã«ä»ã®äœããå¿çããå Žåãpingã忢ãïŒEMPTYãè¿ããŸãïŒãæåŸã®ãªã¯ãšã¹ãã®çµæããµãã¹ã¯ã©ã€ããŒã«è¿ããŸãïŒæåŸã®ïŒïŒæŒç®åïŒ
- åçãåãåã£ãåŸãçµæãååŸããŠåŠçããŸãã ãã©ãŒã ã®ãªããžã§ã¯ãããµãã¹ã¯ã©ã€ããããŸãïŒ
{ empty: false // - }
ãªã¢ã¯ãã£ããã©ãŒã
Angularãã¬ãŒã ã¯ãŒã¯ã®ReactiveFormsã©ã€ãã©ãªã䜿çšããŠãæ¯æãããã¥ã¡ã³ãã®ãªã¢ã¯ãã£ãWebãã©ãŒã ãèšèšããã¿ã¹ã¯ãæ€èšããŠãã ããã
ã©ã€ãã©ãªFormControlãFormGroupãFormArrayã®3ã€ã®åºæ¬ã¯ã©ã¹ã䜿çšãããšããã©ãŒã ãã£ãŒã«ãã®å®£èšçãªèšè¿°ã䜿çšãããã£ãŒã«ãã®åæå€ãèšå®ããåãã£ãŒã«ãã®æ€èšŒã«ãŒã«ãèšå®ããããšãã§ããŸãã
this.myForm = new FormGroup({ name: new FormControl('', Validators.required), // surname: new FormControl('') });
倿°ã®ãã£ãŒã«ããæã€ãã©ãŒã ã®å ŽåãFormBuilderãµãŒãã¹ã䜿çšããã®ãäžè¬çã§ããããã«ãããããã³ã³ãã¯ããªã³ãŒãã䜿çšããŠãã©ãŒã ãäœæã§ããŸãã
this.myForm = this.fb.group({ name: ['', Validators.required], surname: '' });
æ¯æãæ³šæããŒãžã®ãã³ãã¬ãŒãã«ãã©ãŒã ãäœæããåŸãmyFormãã©ãŒã ãžã®ãªã³ã¯ããã£ãŒã«ãåãšå§ã®ååãæå®ããã ãã§ååã§ãã
<form [formGroup]="myForm"> <label>Name: <input formControlName="name"> </label> <label>Surname: <input formControlName="surname"> </label> </form>
çµæãšããŠåŸãããèšèšã«ããããŠãŒã¶ãŒå ¥åã®çµæãšããŠãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã«åºã¥ããŠããã©ãŒã ãã£ãŒã«ããééããæ å ±ã®ãããŒãçæããã³è¿œè·¡ã§ããŸãã ãããè¡ãã«ã¯ãValueChangesãã©ãŒã ã®éåæãªãã¶ãŒããŒã«ãã£ãŠçæãããã€ãã³ãããµãã¹ã¯ã©ã€ãããã ãã§ã
this.myForm.valueChanges .subscribe(value => { ⊠// })
ãŠãŒã¶ãŒãåä¿¡è ã®TINãŸãã¯çµç¹åãå ¥åãããšãã«ãæ¯æãå ã®è©³çްãèªåçã«å ¥åããããã®èŠä»¶ãââããžãã¹ããžãã¯ã§å®çŸ©ãããŠãããšããŸãã ãŠãŒã¶ãŒãçµç¹ã®TIN /ååã«å ¥åããããŒã¿ãåŠçããããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
this.payForm.valueChanges .pipe( mergeMap(value => this.getRequisites(value)) // ) .subscribe(requisites => { this.patchFormByRequisites(requisites) // })
æ€èšŒ
ããªããŒã¿ã«ã¯æ¬¡ã®2ã€ã®åœ¢åŒããããŸãã
- åæ;
- éåæã
åæããªããŒã¿ã«å®æçã«ééããŸã-ãããã¯ããã£ãŒã«ããæäœãããšãã«å ¥åãããããŒã¿ããã§ãã¯ãã颿°ã§ãã ãªã¢ã¯ãã£ããã©ãŒã ã«é¢ããŠïŒ
ãåæããªããŒã¿ãŒã¯ãå¶åŸ¡åœ¢åŒãåãããšã©ãŒãããå Žåã¯çå®ã®å€ãè¿ãããã以å€ã®å Žåã¯åœç©ãè¿ã颿°ã§ããã
function customValidator(control) { return isInvalid(control.value) ? { code: "mistake", message: "smth wents wrong" } : null; }
ãã¹ããŒãã以åã«è奿æžã®ã¿ã€ããšããŠç€ºãããŠããå ŽåããŠãŒã¶ãŒããã©ãŒã ã§äžé£ã®ææžã瀺ãããã©ããã確èªããããªããŒã¿ãŒãå®è£ ããŸãã
function requredSeria(control) { const docType = control.parent.get("docType"); let error = null; if (docType && docType.value === "passport" && !control.value) { error = { code: "wrongSeria", message: " " } } return error; }
ããã§ã¯ã芪ãã©ãŒã ãåç §ããããã䜿çšããŠå¥ã®ãã£ãŒã«ãã®å€ãååŸããŸãã ãšã©ãŒãšããŠtrueãè¿ãããšãã§ããŸãããããã®å Žåã¯å¥ã®æ¹æ³ã§è¡ãããšã«ããŸããã ãããã®ãšã©ãŒã¡ãã»ãŒãžã¯ãã³ã³ãããŒã«ãŸãã¯ãã©ãŒã ã®ãšã©ãŒãã£ãŒã«ãã§ãã£ããã§ããŸãã ãã£ãŒã«ãã«è€æ°ã®ããªããŒã¿ãããå Žåãã©ã®ããªããŒã¿ãç®çã®ãšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºã«å€±æããããæ£ç¢ºã«æå®ããããä»ã®ãã£ãŒã«ãã®æ€èšŒã調æŽãããã§ããŸãã
ããªããŒã¿ã¯æ¬¡ã®ããã«ãã©ãŒã ã«è¿œå ãããŸãã
this.documentForm = this.fb.group({ docType: ['', Validators.required], seria: ['', requredSeria], number: '' });
ããã«äœ¿çšã§ããããã€ãã®ããªããŒã¿ãŒãå©çšã§ããŸãã ãããã¯ãã¹ãŠValidatorsã¯ã©ã¹ã®éçã¡ãœããã§è¡šãããŸãã ããªããŒã¿ãäœæããæ¹æ³ããããŸãã
1ã€ã®ãã£ãŒã«ããééã£ãŠãããšãããã«ãã©ãŒã å šäœãç¡å¹ã«ãªããŸãã ããã¯ããã©ãŒã ã«å°ãªããšã1ã€ã®ç¡å¹ãªãã£ãŒã«ããããå Žåã«ãç¹å®ã®[OK]ãã¿ã³ãç¡å¹ã«ããå¿ èŠããããšãã«äœ¿çšã§ããŸãã ãã®åŸããã¹ãŠã1ã€ã®æ¡ä»¶ãmyform.invalidãããã§ãã¯ããããšã«ãªããŸããããã¯ããã©ãŒã ãç¡å¹ãªå Žåã«trueãè¿ããŸãã
éåæããªããŒã¿ãŒã«ã¯ãæ»ãå€ã®ã¿ã€ããšãã1ã€ã®éãããããŸãã çå®ãŸãã¯åœã®å€ã¯ãçŽæãŸãã¯ãªãã¶ãŒããã«ã§æž¡ãå¿ èŠããããŸãã
åã³ã³ãããŒã«ãŸãã¯åãã©ãŒã ã«ã¯ã¹ããŒã¿ã¹ïŒmySuperForm.statusïŒãããããæå¹ãããç¡å¹ãããç¡å¹ãã®ããããã§ãã éåæããªããŒã¿ãŒã䜿çšããå Žåããã©ãŒã ãçŸåšã©ã®ç¶æ ã«ããããæç¢ºã§ãªãå¯èœæ§ãããããããPENDINGãã®ç¹å¥ãªã¹ããŒã¿ã¹ããããŸãã ãã®æ¡ä»¶ïŒmySuperForm.status ===â PENDINGâïŒã®ãããã§ãããªããŒããŒã衚瀺ããããä»ã®ãã©ãŒã ã¹ã¿ã€ãªã³ã°ãå®è¡ãããã§ããŸãã
èªåä¿å
éè¡çšãœãããŠã§ã¢ïŒãœãããŠã§ã¢ïŒã®éçºã«ã¯ãããŸããŸãªæšæºææžã®æäœãå«ãŸããŸãã ããšãã°ããããã¯ã¢ããªã±ãŒã·ã§ã³ãã©ãŒã ãŸãã¯ã¢ã³ã±ãŒãã§ããã倿°ã®å¿ é ãã£ãŒã«ãã§æ§æãããå ŽåããããŸãã ãã®ãããªèšå€§ãªããã¥ã¡ã³ãã䜿çšããå ŽåããŠãŒã¶ãŒã®å©äŸ¿æ§ãé«ããããã«èªåä¿åã®ãµããŒããå¿ èŠã§ãããã®ãããã€ã³ã¿ãŒãããæ¥ç¶ããã®ä»ã®æè¡çãªåé¡ããªããªã£ãŠãããŠãŒã¶ãŒã以åã«å ¥åããããŒã¿ã¯ãµãŒããŒã®ãã©ããããŒãžã§ã³ã«æ®ããŸãã
ã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãŒããã¯ãã£ã®èªåä¿åæé ã®äž»ãªåŽé¢ã¯æ¬¡ã®ãšããã§ãã
- ä¿åèŠæ±ã¯ã倿Žãè¡ãããé åºã§ãµãŒããŒã«ãã£ãŠåŠçãããå¿ èŠããããŸãã å倿Žã«ããã«ãªã¯ãšã¹ããéä¿¡ããå Žåã以åã®ãªã¯ãšã¹ããæ¬¡ã«æ¥ããæ°ãã倿Žãäžæžãããªãããšãä¿èšŒã§ããŸããã
- ãŠãŒã¶ãŒãå ¥åãå®äºãããŸã§ããµãŒããŒã«å€§éã®ãªã¯ãšã¹ããéä¿¡ããå¿ èŠã¯ãããŸãããã¿ã€ãã³ã°ã§ãããè¡ãããšã§ååã§ãã
- æ¯èŒç倧ããªé å»¶ã§ããã€ãã®å€æŽãè¡ãããæåã®å€æŽã®èŠæ±ããŸã è¿ãããŠããªãå Žåãæåã®èŠæ±ãè¿ãããçŽåŸã«åŸç¶ã®å€æŽããšã«èŠæ±ãéä¿¡ããå¿ èŠã¯ãããŸããã ç¡é¢ä¿ãªããŒã¿ãéä¿¡ããªãããã«ãåŸè ã®ã¿ã䜿çšã§ããŸãã
æåã®ã±ãŒã¹ã¯ã concatMapæŒç®åã䜿çšããŠç°¡åã«åŠçã§ããŸãã 2çªç®ã®ã±ãŒã¹ã¯ã debounceTimeã䜿çšããŠåé¡ãªã解決ãããŸãã 3çªç®ã®ããžãã¯ã¯æ¬¡ã®ããã«èª¬æã§ããŸãã
const lastRequest$ = new BehaviorSubject(null); // queue$.subscribe(lastRequest$); queue$ .pipe( debounceTime(1000), exaustMap(request$ => request$.pipe( // , map(response => ({request$, response})), // catchError(() => of(null) // ) ) .subscribe(({request$, response}) => { if (lastRequest$.value !== request$) { queue$.next(lastRequest$.value); // } });
ãªã¯ãšã¹ããéä¿¡ããããã«saveQueue $ã«æ®ããŸãã concatMapã®ä»£ããã«exaustMapæŒç®åãååšããããšã«æ³šæããŠãã ããã ãã®æŒç®åã¯ãå éšã®ç£èŠããã®ç£èŠãå®äºããïŒãã³ã³ãã€ã«ããããïŒãŸã§ãå€éšã®ç£èŠå¯èœã®ãã¹ãŠã®éç¥ãç¡èŠããããã«å¿ èŠã§ãã ãããããã®å Žåããªã¯ãšã¹ãäžã«æ°ããéç¥ã®ãã¥ãŒãååšããå ŽåãæåŸã®éç¥ãååŸããŠæ®ããç Žæ£ããå¿ èŠããããŸãã exaustMapã¯ãæåŸã®ãã®ãå«ããã¹ãŠãããããããŸãã ãããã£ãŠãæåŸã®éç¥ãBehaviorSubjectã«ä¿åããçŸåšã®å®äºãããªã¯ãšã¹ããæåŸãšç°ãªãå Žåã¯ãµãã¹ã¯ãªãã·ã§ã³ã«ä¿åããŸã-æåŸã®ãªã¯ãšã¹ããåã³ãã¥ãŒã«æå ¥ããŸãã
ãŸãã catchErrorã¹ããŒãã¡ã³ãã䜿çšããŠå®è£ ãããã¯ãšãªäžã®ãšã©ãŒãç¡èŠããããšã泚ç®ã«å€ããŸãã ä¿åäžã«ãšã©ãŒãçºçããããšããŠãŒã¶ãŒã«éç¥ãããããè€éãªãšã©ãŒåŠçãäœæã§ããŸãã ãããããã®æ¬è³ªã¯ãã¹ããªãŒã ã§ãšã©ãŒãçºçããå Žåããšã©ãŒããã³å®å šãªéç¥ã®å Žåã®ããã«ãã¹ããªãŒã ãéããŠã¯ãªããªããšããããšã§ãã
ãããã«
RxJSã©ã€ãã©ãªã䜿çšãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ãã¯ãããžã®çŸåšã®éçºã¬ãã«ã§ã¯ããªã¢ãŒããã³ãã³ã°ã·ã¹ãã ã®è² è·ã®é«ãã€ã³ã¿ãŒãã§ã€ã¹ãšã®çžäºäœçšãæŽçããããã®è¿œå ã®äººä»¶è²»ãªãã§ããªã³ã©ã€ã³ãã³ãã³ã°ã·ã¹ãã çšã®æ¬æ Œçãªã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
RxJSãåããŠç¥ã£ã人ã¯ããã¶ã€ã³ãã¿ãŒã³ãObserverããå®è£ ããã©ã€ãã©ãªã®ãè€éããã«çŽé¢ããŠããçµéšè±å¯ãªéçºè ã§ãã£ãŠãæããããããšãã§ããŸãã ãããããããããããã®å°é£ãå æããŠãRxJSã¯å°æ¥ãç°çš®ããŒã¿ã¹ããªãŒã ã®éåæåŠçã®åé¡ããªã¢ã«ã¿ã€ã ã§è§£æ±ºããããã®äžå¯æ¬ ãªããŒã«ã«ãªãã§ãããã