2013-07-19 22 views
0

我正在嘗試爲我的Action完成Promise [String]。到目前爲止,我已閱讀Play的異步編程文檔http://www.playframework.com/documentation/2.0/ScalaAsync,但有些東西我沒有收到 - 或者文檔錯誤:)在Scala和Play2中完成與異步的承諾[T]

下面是我的代碼大綱。我的意圖是返回一個Promise [String]並在我的Action中完成。 Promise的內容可能來自不同的地方,所以我希望能夠返回一個Promise [String]來讓Action處理器變得簡單。

def getJson = Action { request => 
    val promiseOfJson = models.item.getJson 
    Async { 
    promiseOfJson.map(json => Ok(json)) 
    } 
} 

def models.item.getJson: Promise[String] = { 
    val resultPromise = promise[String] 
    future { 
    ... 
    resultPromise success "Foo" 
    } 

    resultPromise 
} 

查看Play的文檔和「AsyncResult」我想我是做同樣的事情,不是嗎?

問題是,我讓我的異步{}塊內的編譯錯誤:

值映射不是scala.concurrent.Promise成員[字符串]

回答

1

原來,播放從根本上改變了Play版本2.0和2.1之間Asyncs的工作方式。

通過Google搜索「播放異步」,您首先獲得2.0版的文檔,這就是爲什麼我的上述代碼不起作用。 這是文檔的過時版本!

In Play 2.1(docs are here:http://www.playframework.com/documentation/2.1.0/ScalaAsync)Async完成Future [T]而不是Promise [T]。在Play 2.0中,Async完成了一個Promise [T],這就是我所做的(但我正在運行Play 2.1)。

我改變了我的代碼,這一點,它按預期工作:

def models.item.getJson: Future[String] = { 
    val resultPromise = promise[String] 
    future { 
    ... 
    resultPromise success "Foo" 
    } 

    resultPromise.future 
} 
+0

其原因的變化是,斯卡拉2.10現在被使用,它得到了一個未來/無極API作爲標準庫的一部分。現在玩遊戲使用它而不是自己的實現。 – johanandren

+0

不知道這是否相關,但我運行Scala 2.9.1,因爲它只在Ubuntu 12.04上可用。 –

+0

Play包含它自己捆綁的Scala版本,因此您甚至不需要安裝Scala就能夠編碼play/scala。 – johanandren