2014-02-15 175 views
3

我想創建一個play.libs.F.Promise從一個異步第三方服務的呼叫,所以我可以鏈接呼叫並返回Promise<Result>,而不是在控制器內部阻塞。事情是這樣:如何創建並完成play.libs.F.Promise?

final Promise<String> promise = new Promise(); 
service.execute(new Handler() { 
    public void onSuccess(String result) { 
    promise.complete(result); 
    } 
}) 
return promise; 

遺憾的是,似乎沒有要創建一個空的play.libs.F.Promise的方式,並沒有方法來完成一個承諾,要麼?

回答

1

你必須:

import akka.dispatch.Futures; 

final scala.concurrent.Promise<String> promise = Futures.promise(); 
service.execute(new Handler() { 
    public void onSuccess(String result) { 
     promise.success(result); 
    } 
}) 
return Promise.wrap(promise.future()); 
1

假設播放和當前版本play.libs.F.Promise,一個承諾可以用兩種方法創建:1)使用階未來和回調或2)採用一個play Function0(替換一種用於任何類):

import static akka.dispatch.Futures.future; 
//Using 1) 
Promise<A> promise=Promise.wrap(future(
    new Callable<A>() { 
     public A call() { 
     //Do whatever 
     return new A(); 
    } 
}, Akka.system().dispatcher())); 

//Using 2) - This is described in the Play 2.2.1 Documentation 
// http://www.playframework.com/documentation/2.2.1/JavaAsync 
Promise<A> promise2= Promise.promise(
    new Function0<A>() { 
    public A apply() { 
     //Do whatever 
     return new A(); 
    } 
    } 
); 

編輯:當,因爲它是由第三方提供,您可以使用創建一個空承諾的方法,你不能修改異步塊(scala promise,不張揚框架的承諾)。然後你可以使用包含Scala的承諾未來產生play.libs.F.Promise如下:

return F.Promise.pure(null); 
+0

的'service'是由第三方提供,如上所述,它也是異步的。那麼如何創建一個可以在傳遞給服務的回調中完成的Promise? – ejain

+1

在我的編輯主要評論中查看。它應該像那樣工作。 –

0

您可以通過以下操作返回空話使用F.RedeemablePromise

RedeemablePromise<String> promise = RedeemablePromise.empty(); 

promise.map(string -> 
    // This would apply once the redeemable promise succeed 
    ok(string + " World!") 
); 

// In another thread, you now may complete the RedeemablePromise. 
promise.success("Hello"); 

// OR you can fail the promise 
promise.failure(new Exception("Problem")); 
0

你可以這樣創建F.Promise:

F.Promise<User> userPromise = F.Promise.promise(() -> getUserFromDb()); 

,並使用它的值時,它已準備就緒:

userPromise.onRedeem(user -> showUserData(user)); 
相關問題