2017-05-13 1 views
1

의 나는 다음과 같은 방법을 가지고 있다고 가정 해 봅시다 :Scala.js의 addEventListener에서 어떻게 반환합니까?

addEventListener 방법 내부 myObj 반환
def registerBlurEventListener(blur: BlurEvent): Unit = { 
    dom.window.addEventListener("blur", (e: FocusEvent) => { 
     val myObj = BlurEvent.doStuff(blur) 
     // How to return myObj? 
    }} 
    } 

아마 수 없습니다. 그러나이 코드는 을 변경하지 않고 값 myObj을 얻는 방법으로 다시 작성 될 수 있습니까?

+0

아마도 * something *, 슬프게도 돌연변이해야 할 것입니다. 'addEventListener' 패턴은 AFAIK 대안을 많이 제공하지 않습니다. 정확히 블러 이벤트의 범위에 따라 달라집니다 ... –

+0

@JustinduCoeur 도움을 주셔서 감사합니다! 가장 좋은 방법은 무엇입니까? –

+0

'myObj'로 무엇을하고 싶습니까? – sjrd

답변

1

registerBlurEventListener에서 myObj을 반환하면 흐림 이벤트가 어느 시점에서 발생했는지 모르기 때문에 대부분의 경우별로 도움이되지 않습니다.

필요한 것은 앞으로 발사되는 흐림 이벤트를 나타내는 값입니다. Monix 나 RxJS와 같은 스트림/관찰 라이브러리 중 하나를 사용하여 메소드에 FocusEvent의 스트림을 만들 수 있습니다.

그러면이 스트림을 값으로 전달할 수 있습니다. 도착하면 새로운 이벤트가있을 때마다 doStuff으로 전화하십시오. 또한 스트림을 맵핑하여 변환 된 값으로 새 스트림을 작성할 수도 있습니다. 정확한 조합은 선택한 스트리밍 라이브러리와 원하는 결과에 따라 다릅니다. 스트림은 일반적으로 게으르므로 모든 새로운 값에 부작용을 실행하려면 스트림을 구독해야합니다. (doStuff) 부작용과 비슷합니다. 여기에서 자세히 설명하는 것은 너무 많습니다.


는, 예를 들면 흐름, 관찰 가능한 한 반응 변수를 사용하여 DOM 조작에 대한 전체 라이브러리 있습니다 Outwatch, Binding.scala, 단항-HTML. 당신이 찾고있는 키워드는 "기능적 반응 형 프로그래밍"입니다. 자바 스크립트가 Scala.js 지원을 수행하는 약속에

이러한 이벤트의 흐름과 반대로 만, 미래에 하나의 흐림 이벤트에 대한 관심이 경우

는 본다. JS 약속은 한 번만 내고 방출 된 값을 기억하는 스트림과 매우 비슷합니다.

0

놀랍습니다. 아무도 아직 답을 얻지 못했습니다.) 이것은 선물의 주요 사용 사례입니다. 이 같은

import scala.concurrent.{Promise, Future} 

def registerBlurEventListener(blur: BlurEvent): Future[MyObj] = { 
    val promise = Promise[MyObj]() 
    dom.window.addEventListener("blur", (e: FocusEvent) => { 
    val myObj = BlurEvent.doStuff(blur) 
    promise.success(myObj) 
    }} 

    promise 
} 

사용 :

import scala.concurrent.ExecutionContext.Implicits.global 

val myObj = registerBlurEventListener(???) 
myObj.foreach(obj => println(obj)) 

주의의 몇이 즉시 값을 반환하지 않지만, 당신이 다시들을 수 있습니다 뭔가를 반환 물론

  • .
  • 이벤트가 한 번만 발생하는 경우에만 작동합니다. 다음에 청취자가 실행되면 promise.success이 예외를 throw합니다. "여러 번 값을 반환"할 것으로 예상되면 반응성 스트림과 같은 것이 필요합니다.
관련 문제