0
db.findUser(id).then(R.pipe(
    R.ifElse(firstTestHere, Either.Right,() => Either.Left(err)), 
    R.map(R.ifElse(secondTestHere, obj => obj,() => Either.Left(err))), 
    console.log 
)) 

첫 번째 테스트가 통과하지 않으면 Either.Left가 반환되고 두 번째 테스트는 호출되지 않습니다. 그것은 넣어 것입니다 : 첫 번째는 통과하지만, 두 번째는, 그것이 될 것입니다하지 않는 경우 어느 쪽을 옮기는 방법. 오른쪽 모두. 왼쪽?

_Right {value: user}

그러나

가 :

_Right {value: _Left {value: err}}

을 내가 출력 _Left {값으로 원하는 : 오류 수정}, 코드를 수정하는 방법 또는 오른쪽으로 왼쪽으로 전송할 수있는 방법이 있습니까?

+0

어디'err' 매개 변수에서 오는 : R.pipeK를 사용

, 당신의 예는 같은 것으로 수정 될 수 있을까? –

+0

그것은 단지 다른 곳에서 선언하고 있습니다 :() => 새로운 오류 ('some err msg here') – qwang

답변

2

map은 두 개의 Either 인스턴스를 함께 "평탄화"할 수 없다는 것을 알고 있습니다. 그렇게하려면 대신 chain을 사용하는 것이 좋습니다.

db.findUser(id).then(R.pipe(
    R.ifElse(firstTestHere, Either.Right,() => Either.Left(err)), 
    R.chain(R.ifElse(secondTestHere, Either.Right,() => Either.Left(err))), 
    console.log 
)) 

일부 모나드을 생성하는 기능, 즉도 구성 될 수있는 각 기능 형태 Monad m => a -> m b를 취해야 composeK/pipeK, 달성 될 수 함께 체인 호출 일련의 구성이 패턴 (예 Either)를 주어진 값에서 제거합니다.

// helper function to wrap up the `ifElse` logic 
const assertThat = (predicate, error) => 
    R.ifElse(predicate, Either.Right, _ => Either.Left(error)) 

const result = db.findUser(id).then(R.pipeK(
    assertThat(firstTestHere, err), 
    assertThat(secondTestHere, err) 
));