Pull to refresh

Comments 10

Ну вы бы хоть больше о Future рассказали. А что произойдет, если вдруг выскочит Exception во Future?

Future[U] — это часть Scala API, а не Play

Вот статься, которая расскажет о Future[U] docs.scala-lang.org/overviews/core/futures.html

А вообще ставлю Вам плюс, за попытку популяризации такого замечательного фреймворка. И хотелось бы добавить, что не смотря на такой юный возвраст, на Play Framework уже работает LinkedIn и куча других очень популярных приложений.
«И этот вариант работает хорошо, пока код выполняется верно. Но от ошибок при выполнении не застрахован никто, а если ошибка случится в блоке кода, выполняющемся асинхронно, она может привести к тому, что результат так и не будет сформирован. А это значит, что пользователь не получит ответа и его браузер останется в ожидании пока он, наконец, не закроет вкладку. Избежать этого, однако, довольно просто: каждому обещанию (то есть Future[Result]) можно поставить тайм-аут: если в течение этого времени мы не получим реальный результат — будет сформирована ошибка»


Разве не логичнее вызывать callback в случае ошибки с соответствующим результатом (код ошибки и т.п.)?
Таймаут тоже можно добавить, конечно, но ошибки все же надо обрабатывать.
Future[U] вернет Try[U]. И там на выбор будет либо инстанс исключения, либо результат. Ошибки в любом случае нужно обрабатывать
стоп стоп стоп

когда это Future возвращает Try?

обработка исключений идет через recover
У инстанса Future есть метода onComplete который принимает функцию, которая принимает Try как параметр. Если Future обработал корректно — будет Success, если нет — Failure. Это, наверное, самый правильный способ работать с Future.

Еще есть метода onSuccess и onFailure.

Можно здесь почитать

UPD: хотя recover тоже круто
И все же, в контексте использования Future внутри async блоков фреймворка необходимо возвращать значение Future[SimpleResult], а onSuccess, onComplete и иже с ними вернут Unit. Поэтому map-recover тут более уместен. Можно, конечно, извратиться с промисами, но зачем?
Тут цели разные. onComplete — это способ получения и вывода значения из под Future (или ошибки, если она произошла). Цепочки асинхронных блоков, разумеется, нужно конструировать с помощью map, flatMap и recover, ибо все эти функции сами порождают новый Future.
Да кстати, в случае с play framework без асинхронизма далеко не уйдешь. Oн ведь крутится на netty, а этот товарищ по архитектуре существенно отличается от классического j2ee сервлет контейнера.
Sign up to leave a comment.