2015-01-22 2 views
0

Imagaine У меня есть следующий код:Получить асинхронный результат от слушателя

class Listener { 

    //excuted by thread 1 
    //called when request is finshed 
    def complete(result: Result) = //get result as return value for request 

} 


//excuted by thread 2 
def request: Result = { 
    //Do something that invokes Listener.complete 
    //return result from listener 
} 

Как я уже писал в комментариях, я хочу, чтобы получить результат моей Listener.complete функции как результат для моей функции запроса , Я мог бы архивировать это, комбинируя блокировку с var, но это не хороший стиль scala. Итак, каковы же альтернативы?

+1

Посмотрите актеров акки или хотите встроенное решение, а затем используйте Futures (http://docs.scala-lang.org /overviews/core/futures.html) – mohit

+0

Слушатель предоставляется, поэтому я должен использовать его и не могу использовать akka или Futures –

ответ

1
def request: Future[Result] = { 
    val p = promise[Result] 

    new Listener { 
    def complete(result: Result) = p.success(result) 
    } 

    p.future 
} 

Теперь у вас есть Future[Result], который вы можете передать обратно своему абоненту. Если у вас есть асинхронная функция (что вы делаете), вы не должны пытаться скрыть этот факт. Вместо этого используйте свое будущее и позвольте своему абоненту работать с этим, используя map, flatMap, onSuccess и т. Д.

+0

именно то, что я хочу! танки –

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

  • Нет связанных вопросов^_^