2014-10-30 138 views
1

我目前正在構建一個使用返回結果作爲F.Promise(Java Promise)的庫的Scala播放框架應用程序。有沒有辦法將F.Promises(https://www.playframework.com/documentation/2.1.0/api/java/play/libs/F.Promise.html)轉換爲Scala Promises,或者將F.Promise中的Scala Future包裝掉?轉換播放框架Java Promise播放框架Scala Promise

我目前看到的唯一方法是獲取F.Promise,但這是一個阻塞操作,我想繼續異步工作。

在第一個答案中描述的方式讓我看到了這段代碼。不幸的是我不知道如何正確定義這個F.Function。代碼不能編譯。

回答: 所以,我終於發現,F.Promise有一個名爲wrapped()的方法。這個方法給你一個Scala Future。

回答

3

事實證明,F.Promise(java.play)類具有一個名爲wrapped()的方法,該方法返回由Promise包裝的scala.concurrente.Future。所以你所要做的就是調用包裝在F.Promise上。

val promise: F.Promise[T] = getPromise() 
val future : Future[T] = promise.wrapped() 
+0

這將是一件好事,如果你可以進入一個這裏再詳細一點,解釋你做了什麼。 – blalasaadri 2014-10-31 09:30:45

+1

增加了一些更多的解釋。 :) – MeiSign 2014-10-31 09:51:52

1

好吧,由於該生態系統中沒有對承諾或期貨的「標準」,因此您必須手動完成。在遊戲承諾和scala期貨之間沒有「同化」的概念。

基本上,我們把F.Promise當成我們要處理的回調,我們通過創建一個Promise(它在Scala中令人困惑的意思是「創造Future的那個」)將它轉換爲scala Future。這裏是如何工作的,而不是代碼的描述,因爲我認爲這將更好地解釋了理由:

  • 創建一個新的Promise[T] - 在F.Promise你,在F.Function傳遞給它p
  • 呼叫.map ,請撥打p success與承諾的價值 - 有效地解決承諾。
  • 同樣 - 在承諾和呼叫p failure內呼籲.recover與失敗的原因。
  • 返回p.future,這是一個未來代表價值p解決 - 因爲我們鏡像成功和失敗渠道,這將工作。

這與你將其他任何東西轉換爲scala Future沒有什麼不同。在另一個方向轉換工作類似。

+0

Iam不知道我是否可以完全跟隨你,但我會嘗試將它放入代碼。感謝您的快速回答 – MeiSign 2014-10-30 10:30:21

+1

@MeiSign我的目標是讓您瞭解我們正在做什麼以及爲什麼 - 我正在試驗回答解決方案的步驟而不是解決方案本身,因爲我認爲它可能更具生產力 - 如果你卡住讓我知道,我會盡力澄清。 – 2014-10-30 10:32:45

+0

我想我理解你的想法,但我正在努力將F.Function傳遞給java map函數。你能幫我解決這個問題嗎?這是我到目前爲止:http://www.gist.github.com/MeiSign/ef70b73ae8433a8c53cd – MeiSign 2014-10-30 13:02:13