2016-12-15 17 views
14

Wiem, że to dość otwarte pytanie i przepraszam.Różnica Await.ready i Await.result

widzę, że Await.ready powraca Awaitable.type podczas gdy Await.result zwraca T ale nadal je pomylić.

Jaka jest różnica między tymi dwoma?

Czy jedno blokowanie, a drugie nie blokuje?

Odpowiedz

16

Obydwa bloki blokują się do momentu zakończenia, różnica jest tylko ich typem zwrotu.

Różnica jest przydatna, gdy Future generuje wyjątki:

def a = Future { Thread.sleep(2000); 100 } 
def b = Future { Thread.sleep(2000); throw new NullPointerException } 

Await.ready(a, Duration.Inf) // Success(100) 
Await.ready(b, Duration.Inf) // Failure(java.lang.NullPointerException) 

Await.result(a, Duration.Inf) // 100 
Await.result(b, Duration.Inf) // crash with java.lang.NullPointerException 
1

Ogólnie oba są blokowane.

Różnica polega na tym, że Await.ready blokuje się do momentu zakończenia Future (udanej lub nieudanej) w danym czasie.

Jedyną różnicą jest to, że ready bloki aż do Awaitable jest gotowa i nie result otrzymując typ wyniku T.

Postscriptum: W praktyce, jeśli chcesz, aby wykonać pewne czynności, takich jak sprawdzanie błędów lub zalogowaniu byś wziąć Await.ready(...) jeśli chcesz skomponować wynik i wygeneruje błąd, jeśli coś pójdzie nie tak zabiorą Await.result(...).

Jako ogólna zasada - staraj się unikać Oczekiwanie.