2016-12-08 47 views
0

我有以下函數驗證rangeFrom並不優於rangeTo,並且範圍列表中尚不存在rangeFrom。使用RxJS進行數據驗證

如何使用RxJS重寫?

const isTagAlreadyExist = (tags, currentTag) => _(tags) 
    .filter(x => x.id !== currentTag.id) 
    .some(x => _.inRange(currentTag.rangeTo, x.rangeFrom, x.rangeTo)) 
    .value(); 

const validateRangeFrom = (tags, currentTag) => { 
    const errors = {}; 

    if (isNumeric(currentTag.rangeFrom)) {  
     if (!_.inRange(currentTag.rangeFrom, 0, currentTag.rangeTo)) { 
      errors.rangeFrom = 'FROM_TAG_CANNOT_BE_GREATER_THAN_TO_TAG'; 
     } else if (isTagAlreadyExist(tags, currentTag)) { 
      errors.rangeFrom ='TAG_ALREADY_EXISTS'; 
     } 
    } 

    return { 
     errors 
    }; 
}; 

回答

1

問題是:你想重寫哪些部分到rxjs?這些都是從我所看到的同步運行兩個純函數,我實在看不出太大的rxjs一個用例,在這裏 - 當然,你總是可以利用自己的功能的rxjs流中:

const validateRangeFrom$ = (tags, currentTag) => { 
    return Observable.of(currentTag) 
     .map(tag => validateRangeFrom(tags, tag)); 
} 

validateRangeFrom$(myTags, currentTag) 
    .subscribe(errors => console.log(errors)); 

但你可以看,如果你簡單地把它包裝在一個流中,這是沒有什麼意義的,有用的反應式編程的本質上說,一切都是反應性的,而不僅僅是一些小部分,所以對於你的例子,你應該開始有tags$currentTag$作爲可觀察到的 - 讓我們假設你有,那麼你可以做類似的事情:

const tags$: Observable<ITag[]>...  // is set somewhere, and emits a new array whenever it is changed 
const currentTag$: Observable<ITag>... // is set somewhere and emits the tag whenever a new currentTag is set 

const validateRangeFrom$ = Observable 
    .combineLatest(tags$, currentTag$, (tags, tag) => ({tags, tag})) 
    .map(({tags, tag}) => validateRangeFrom(tags, tag)); 

validateRangeFrom$.subscribe(errors => console.log(errors)); 

無論何時發出新的標籤數組或者選擇新的currentTag時,它都會自動觸發驗證 - 但同樣:您的驗證方法保持不變 - 即使在反應式編程中您也必須進行驗證和邏輯操作,反應部分通常只涉及數據流(請參閱:tags$currentTag$

+0

感謝您的解釋,仍然在學習RxJS,目前還不清楚如何使用它。這有幫助,謝謝。 – Anas