2013-08-06 24 views
5

Play Framework kullanarak, bazen bu durumla karşı karşıya am: Oyun Çerçevesinde Scala Geleceği Kullanımı?

def myFunction:Future[String] = { 
    // Do some stuff 
} 

myFunction.onComplete { 
    case Success(myString) => // Du Stuff 
    case Failure(error) => // Error handling 
} 

Ama Scala doc belirtildiği gibi, Future.onComplete bir Birimi döndürür

. Action işlevleri örneğin SimpleResult beklediğinde Playframework'da bunları nasıl kullanabilirim? Vadeli işlemler için en iyi uygulamalar nelerdir?

DÜZENLEME: Ben Scala Gelecek için Çal Future işlem gören Play-2.2.x şube kullanıyorum eklemek gerekir.

+0

İlginç bağlantı @ flavian, teşekkürler. –

cevap

7

Sen Async kullanabilirsiniz:

def index = Action{ 
    val myFunction:Future[Option[String]] = // 
    Async{ 
     myFunction.map{ 
     case Some(x) => Ok(x) 
     case None => InternalServerError 
     } 
    } 
} 

Temelde bunu oynamak söyle: myFunction değerlendirilir zaman, kullanıcı geri sonucunu döndürür. Buradaki hile, bir geri arama kullanmak yerine Future içeriğindeki map içeriğidir, bu sonuç üzerinde çalışmanızı sağlar.

harika parçası

hala asenkron olmasıdır. Http isteği iş parçacığı değerlendirme dizininin engellenmeyeceği anlamında.

bunun here Bazı belgeler.

+0

Emin misin? Bildiğim kadarıyla Async, 'Gelecek [SimpleResult]' u beklerken, 'OnComplete' bir Birim döndürür. Bunu derlememek. Ayrıca PlayStation Futures tarafından Play'in Vadeli İşlemlerini değiştiren Play 2.2.0-M2'yi kullanmamı eklemeliydim. –

+0

Kodu düzenledi, – Jatin

1

Çal (2.1 en az) yararlı bulabileceğiniz bir extend1 yöntemi ekler: Muhtemelen daha iyi

def myFunction: Future[String] = ??? 

myFunction.extend1 { 
    case Redeemed(v) => s"Got result string: $v" 
    case Thrown(t) => s"Got throwable: ${t.getMessage}" 
} // : Future[String] 

Ancak örneğin kullanarak, açıkça başarısız hesaplamaları yapmak Option (Jatin'de gösterildiği gibi), Either veya scalaz.\/.

Düzenleme: Eğer işaret olarak, PlayPromise Oynat 2.2'de kaldırılmıştır. Bu örneğin, Future yöntemlerle davranışını taklit etmek Önemsiz:

myFunction.map(v => s"Got result string: $v").recover { 
    case t => s"Got throwable: ${t.getMessage}" 
} 

bunu uygun implicits eklemek basit olurdu extend1 sözdizimi yeniden isteseydim.

+0

'dan önce özür dilerim, gerçekten '2.2' öncesi sürümlerde, '.extend1' kullanmıştım ancak imzası 'scala.concurrent.Future' ile uyumsuz. –

+0

Cevabımı, bunu yapmanın yollarından birini içerecek şekilde düzenledim. Örneğin, yeni bir 'Promise' oluşturabilir, onu 'onComplete' bloğuyla besleyebilir ve 'Future'' i geri gönderebilirsiniz. – Hugh

İlgili konular