0

假设我需要从我的方法中返回一个承诺,这取决于外部资源和一些计算。我想象的是这样的:

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(播放 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,但我认为您仍然应该能够替换callWhenReadymap(并向回调函数添加Integer类型参数)。

于 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 回答