2013-08-01 2 views
5

Я создаю библиотеку, которая в рамках своей функциональности делает HTTP-запросы. Чтобы заставить его работать в нескольких средах, он будет развернут, я бы хотел, чтобы он работал с фьючерсами или без них.Syncronous Scala Будущее без отдельной темы

Один из вариантов заключается в том, что библиотека параметризует тип ответа, поэтому вы можете создать экземпляр библиотеки с типом Future или экземпляр типа Id, в зависимости от того, используете ли вы асинхронную реализацию HTTP. (Id может быть монодатой Identity - достаточно для обеспечения согласованного интерфейса для пользователей)

Я начал с этого подхода, но у него получилось сложнее. То, что я действительно хотел бы сделать, это использовать тип будущего везде, в случае необходимости, синхронные ответы в боксе. Тем не менее, я понимаю, что использование Futures всегда будет включать какой-то поток. Это не будет летать, например. AppEngine (требуемая среда).

Есть ли способ создать Будущее из значения, которое будет выполняться в текущем потоке и, следовательно, не будет вызывать проблемы в средах, где невозможно создавать потоки?

(пс в качестве дополнительного требования, мне нужно, чтобы иметь возможность пересечь построить библиотеку обратно в Scala v2.9.1, которые могут ограничить возможности, доступные в scala.concurrent)

+1

'Есть ли способ создать будущее из значения, которое будет выполняться в текущем потоке 'Зачем использовать будущее? – Jatin

+0

Как я объясню, чтобы создать согласованный тип возвращаемого значения в реализациях – adamnfish

+1

Прошу прощения, я не понял вопрос. Если вы имеете в виду, что у вас уже есть конечное значение результата и для него нужна будущая оболочка, то как насчет использования 'Promise'? – Jatin

ответ

3

Из того, что я понимаю, что вы хотите выполнить что-то, а затем обернуть результат Future. В этом случае, вы всегда можете использовать Promise

val p = Promise[Int] 
p success 42 
val f = p.future 

Следовательно, теперь у вас есть future оболочку, содержащих конечное значение 42

Promise очень хорошо объяснен here.

+0

Ах, конечно, спасибо! Фантастическая ссылка. Проблема здесь в том, что вам все равно необходимо предоставить ExecutionContxt (неявно или иначе). Мне непонятно, действительно ли предоставленный ExecutionContext используется с этим подходом Promise, но в любом случае это заканчивается как проверенные исключения в Java, причем контекст должен быть включен полностью через приложение, которое потребляет будущее. – adamnfish

+3

Кроме того, объект Promise включает в себя способ сделать это немного более кратко: 'Promise.successful (42) .future'. – adamnfish

+0

@adamnfish Нет необходимости выполнять ExecutionContext для вышеуказанного бита кода. Мы никуда не отправляемся. Я думаю, вы ошибаетесь. Достаточно «import scala.concurrent._». Также, пожалуйста, примите ответ, если вы считаете, что он отвечает :) – Jatin

1

Возьмите look в скалярной версии будущей черты. Это основано на вершине механизма Trampoline, который будет выполняться текущим потоком, если только fork или apply не будет вызываться +, что полностью удаляет все экземпляры ExecutionContext =)

+0

Очень интересный подход, спасибо большое. Я бы предпочел не включать сказаз (особенно, поскольку последняя версия не крепится до 2.9.1), но избавление от импорта ExecutionContext было бы очень удобно здесь. – adamnfish

Смежные вопросы