2016-09-01 3 views
4

나는 FuturePromises을 사용하여 Scala Concurrency으로 기울고 있습니다.미래의 콜백 메소드와 약속 [성공과 실패]의 차이점은 무엇입니까?

나는 요점을 얻지 못하고 있는데, Callback 방법을 사용하여 미래를 완료하고 약속을 사용하는 것과 정확히 다른 점은 무엇입니까?

향후 콜백 메소드가 실제로 미래를 완료하지 않는다는 것을 의미합니까? 미래를 완료 할 수 있다는 약속 만 사용하면됩니까?

또한 Futures와 Promises에서 읽을 수있는 곳이 많지만 약속에만 쓸 수 있습니다.

답변

3

선물은 비동기 연산의 끝에서 완료된다 약속 수동으로 완료 할 수있는 미래를 생산할 수

val f: Future[List[Int]] = Future { 
    makeSomeNumbers() //when this finishes, the Future is completed. 
} 

f onSuccess { 
    case foo => println("I was completed when makeSomeNumbers finished") 
} 

반면. 미래 완료하고 무언가를 할 때

val p = Promise[String]() 
val f = p.future 

p success('hi') //when success is called, the Future is completed. 

f onSuccess { 
    case foo => println("I was completed because a Promise told me to do so") 
} 

미래를 완료하지 않는 onSuccess에 전달 된 콜백은, 만 수신합니다. 약속의 경우 해당 success 메서드를 호출하여 관련 미래를 완료 할 수 있습니다.

+0

좋은 설명을 주셔서 감사합니다. 수동으로 '미래'를 완성해야하는 시나리오가 있습니까? – Shankar

+1

@Shankar 예를 들어, 콜백 만 지원하는 타사 라이브러리와 통합 할 때. –

+0

'Future.apply (expr)'이'Future.unit.map (_ => expr)'에 대한 구문 적 설탕이라는 것을 아는 가치가있다. –

0

Future으로 완료되지 않습니다. 완료시 콜백 만 트리거하면됩니다. 콜백이 트리거 될 때 Promise을 사용하여 제어 할 수 있습니다. 스칼라 공식 문서에서 예제 :

val p = Promise[T]() 
val f = p.future 

val producer = Future { 
    val r = produceSomething() 
    p success r 
    continueDoingSomethingUnrelated() 
} 

BTW Future 후드 Promises를 사용하여.

3

completeFuture 수 없습니다.

Future은 계산으로 간주되며이 계산은 한 번 시작되면 완료됩니다. 그것을 작성한 후에는 제어 할 수 없습니다. 이 미래가 완료 될 때 해고 될 것이지만 그 시점을 제어 할 수는 없다는 의미로 onComplete 콜백을 할당 할 수 있습니다.

완료가 제어 할 수있는 Future을 갖고 싶다면 Promise 그 정치가처럼 Future을 사용할 수 있습니다. 성공 또는 실패로 그 미래를 완성하든, 이제 당신에게 달려 있습니다.

// lets promise an Int 
val promise = Promise[Int]() 

// Now... we also have a future associated with this promise 
val future = promise.Future 

// assign a callback which will be called when future completes 
future.onComplete(
    case Success(i) => println("Future complete :: " + i) 
    case Failure(ex) => println("Future failed :: " + ex.toString) 
) 

// Future by itself provides you no way to complete it 

// if you want to complete this future, you can fulfil your promise 
promise.complete(10) 
+1

멋지게 설명하고, 정치인의 좋은 사용. – Samar

+0

@ Sarvesh Kumar Singh : AFAIK, 미래의 계산이 아닙니다. http://stackoverflow.com/a/18961936/1907755를 참조하십시오. – Shankar

+0

... 계산 ... 현재 스레드와 독립적 인 실행 블록을 의미합니다. –

관련 문제