2016-06-26 2 views
0

JS 약속과 관련하여 중요한 것을 놓친 것처럼 보입니다. Promise의 filter 메서드가 약속 내용이 Array/Iterable로 간주되는 이유는 무엇입니까? 비 직관적 인 것처럼 보이지 않습니까? 여기 Bluebird Promise 필터. 왜 배열인가?

는 블루 버드의 필터 서명입니다 :이 표준 라이브러리의 미래/약속이 적어도 하나 개의 언어입니다

Promise.filter(
    Iterable<any>|Promise<Iterable<any>> input, 
    function(any item, int index, int length) filterer, 
    [Object {concurrency: int=Infinity} options] 
) -> Promise 

- 스칼라, 그리고 Promise.filter는 술어가 걸리는 매우 논리적 및 Resolved 약속을 반환하는 경향이있다

Promise.filter(
    <any>|Promise<any> input, 
    function (any item) predicate 
) -> Promise 

이 그것을 사용하는 방법입니다 :

내용이 일부 Error없는 경우와 술어와 Rejected을 제공 선택했으면
getUserFromDatabase() 
    .filter(user => user.isEmailValid) 
    .then( 
    user => { req.statusCode = 200; } // user is okay 
    err => { req.statusCode = 404; } // user is not okay 
) 
+1

Promise.filter()는 ['Array.prototype.filter()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)를 모델로합니다./필터), 스칼라 이후 아닙니다. – robertklep

+1

@robertklep하지만 Promises는 배열과 어떤 관련이 있습니까? 두 가지 모두를 일반 컨테이너로 고려해도 배열에 포함 된 가치에 필터링을 적용하는 것이 논리적 인 것으로 보입니다. 아니면 내가 틀렸어? –

+0

Promise.filter()는 http://bluebirdjs.com/docs/api/promise.filter.html에 잘 설명되어 있습니다. 약속 모음에서 작동하는 기능입니다. 그게 그것이 무엇을 위해 지어 졌는지입니다. – jfriend00

답변

2

"필터링"이 모나드 컨텍스트에서 의미 할 수있는 두 가지 직관이 있습니다. 하스켈 실제로이 아주 명확하게 그것을 는 않기 때문에이에 대한 두 가지 기능이 있습니다으로

mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

직접 MonadPlus 예를 mfilter odd (Just 1) == Just 1에 대한 MonadPlus에 적용 filter의 상당 mfilter odd (Just 2) == Nothing

을 " 직접적인 동등 물 "이라 함은 filter = (mfilter:: (a -> Bool) -> [a] -> [a]을 의미), 즉 과 m[]으로 인스턴스화 된 경우 map = fmap.

filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]

리스트 기반의 필터 기능을 일반화한다.

그것은 아마 모두 FoldableMonoid 아무것도에 목록에서 일반화하지만 이제 간단하게 할 수 있습니다.

이 두 기능은 모두 MonadPlus의 인스턴스 인 약속에 적용될 수 있습니다. Scala는 첫 번째 Bluebird를 선택했습니다.

mfilter은 JavaScript에서 .then(x => { if (predicate(x)) return x else throw … })으로 구현할 수 있으며 동일한 콜백 내에서 오류 메시지를 선택하거나 x에 추가 변환을 적용 할 수 있습니다. 반대로 효율적인 filterM은 구현하기가 쉽지 않지만 여전히 유용하고 종종 필요하므로 Bluebird는 이러한 방법에서 찾을 수있는 동시성 옵션을 포함하여 컬렉션 용 유틸리티 벨트의 일부로이를 제공합니다.

+1

평상시와 같이 어떤 언어에 관한 질문이라도 Haskell의 두 명의 oneliners로 대답 할 수 있습니다 :) –

관련 문제