0

メソッドから promise を返す必要があるとします。これは、外部リソースといくつかの計算に依存します。私が想像しているのは次のようなものです:

Promise<Integer> foo() {
  return WS.url(url)
    .getAsync()
    .callWhenReady(new Function<HttpResponse>(){
      Integer parse(HttpResponse response) {
        // parsing business logic 
        // ...
        int parsed = ...;
        return parsed;
      }
  });
} 

何に使えcallWhenReadyますか?これは基本的にはjQuery.promise()振る舞いと同じです。

4

2 に答える 2

2

私はあなたが望むと思いますF.Promise.map(Play 2.0.2):

    /**
     * Maps this promise to a promise of type <code>B</code>.  The function <code>function</code> is applied as
     * soon as the promise is redeemed.
     *
     * Exceptions thrown by <code>function</code> will be wrapped in {@link java.lang.RuntimeException}, unless
     * they are <code>RuntimeException</code>'s themselves.
     *
     * @param function The function to map <code>A</code> to <code>B</code>.
     * @return A wrapped promise that maps the type from <code>A</code> to <code>B</code>.
     */
    public <B> Promise<B> map(final Function<A, B> function) {
        return new Promise<B>(
            promise.map(new scala.runtime.AbstractFunction1<A,B>() {
                public B apply(A a) {
                    try {
                        return function.apply(a);
                    } catch (RuntimeException e) {
                        throw e;
                    } catch(Throwable t) {
                        throw new RuntimeException(t);
                    }
                }
            })
        );
    }

あなたのコードからは、以前のバージョンの Play を使用しているように見えますが、それでも置き換えることができる (そして型パラメーターをコールバック関数に追加する) ことができるはずだとcallWhenReady思いますmapInteger

于 2012-07-06T20:03:17.550 に答える
0

あなたの質問を完全に理解しているかどうかはわかりませんが、非同期 WS 操作を実行して結果を返したい場合は、次のようにします。

F.Promise<WS.HttpResponse> promise = WS.url(url).getAsync();
// The following line corresponds to your callWhenReady. 
// It waits for the result in a non blocking way.
await(promise);

WS.HttpResponse response = promise.get();

これで、応答に対して何らかの計算を行い、結果を返すことができます。

于 2012-06-08T06:46:06.130 に答える