2014-09-16 2 views
1

저는 Bacon.js의 초보자이며 일반적으로 하스켈에서 프로그램을 작성합니다. Haskell에 대한 저의 경험으로 Bacon.js의 일부 상황을 순전히 기능적 방식으로 설명하고자합니다.Bacon.js의 부작용에 대처하십시오.

다음은 예제 상황입니다.

  • triggerStream은 원본 스트림입니다.
  • resultStreamtriggerStream의 이벤트가 발생하면 아약스 액세스를 시도합니다.
  • resultStream2 또한 resultStream의 아약스 액세스가 완료된 후 아약스 액세스를 시도합니다. (가)
    ### ======= 
    # Streams 
    # ======= ### 
    triggerStream =() -> 
        Bacon.fromArray([1,2,3]) 
    
    resultStream = 
        triggerStream() 
        .flatMap((n) -> Bacon.fromPromise($.ajax(toAjax n))) 
        .zip(triggerStream(), (r,t) -> 
         {result: r, trigger: t} 
    
    resultStream2 = 
        resultStream  # (*) 
        .flatMap((o) -> Bacon.fromPromise($.ajax(toAjax2 o))) 
        .zip(resultStream, (r2,r1) -> 
         {result: r2, trigger: r1.trigger} 
    
    ### ======= 
    # Assignments 
    # ======= ### 
    
    triggerStream() 
        .onValue(beforeAjax1) # (a) 
    resultStream 
        .onValue(afterAjax1) # (b) 
    resultStream2 
        .onValue(afterAjax2) # (c) 
    

    각 트리거 이벤트 후에 실행하는 supporsed되어

    는, 즉이 resultStream의 아약스 액세스하기 전에 실행되는 것 :

이 내 접근 방식입니다.

(b)는 resultStream의 아약스 액세스 이후에 해고되는 것으로 간주됩니다.

(c)는 resultStream2의 아약스 액세스 이후에 시작되도록 허용됩니다.

Bacon.js의 스트림이나 속성이 자체적으로 부작용이 있으므로 내 코드가 제대로 작동하지 않습니다. (b)에서 resultStream의 이벤트가 resultStream 개체에서 제거되어 (*)에서 빈 스트림이 발생합니다.

resultStream을 (triggerStream과 같은) 솔기로 변경하는 접근법은 잘 작동하지만 (b) 및 (c) 때 resultStream의 아약스 액세스가 독립적으로 두 번 발생합니다.

내 접근 방식을 실현할 생각이 있습니까?

+2

문제는 당신이 소스로 Bacon.fromArray를 사용하는에 있습니다

또한 Bacon.js FAQ를 참조하십시오. Bacon.fromArray는 첫 번째 구독자에게 내용을 알려주는 의미에서 약간 펑키 한 동작을 갖는 스트림을 반환합니다. Bacon과 같은 좀 더 현실적인 소스를 시도해 볼 수도 있습니다. – raimohanska

+0

Bacon.fromArray에 관한 사실은 저에게있어서 새로운 것입니다. 정말 고마워! 하지만 아직 작동하지 않는 것 같습니다 ... onValue() at (b)는 모든 스트림을 먹고 (c)는 작동하지 않습니다. – user3749167

+0

미안하지만, 오해했습니다. 당신은 일했습니다. 굉장해! – user3749167

답변

4

문제는 Bacon.fromArray을 원본으로 사용한다는 점입니다. 이 메서드는 동 기적으로 응답하는 스트림을 반환하여 실제 내용을 첫 번째 구독자에게 알려줍니다.

이 작업을 수행하려면 Bacon.sequentially과 같은 좀 더 현실적인 소스를 사용해보십시오. 또는 stream.delay(0)을 사용하여 비동기 적으로 응답하는 것으로 변경할 수 있습니다. https://github.com/baconjs/bacon.js/wiki/FAQ#why-isnt-my-subscriber-called

관련 문제