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().

ответ

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); 
        } 
       } 
      }) 
     ); 
    } 

кажется из вашего кода, который вы используете более раннюю версию, но я думаю, вы все равно должны просто быть в состоянии заменить callWhenReady с map (и добавьте параметр типа Integer в функцию обратного вызова).

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(); 

теперь вы можете сделать некоторые вычисления по ответу и возврат результата.

+0

Я хотел бы составить обещание WS с другим расчетом и вернуть композицию в новое будущее. См. Https://github.com/ripper234/BTCtoX/blob/d8af7fa07bfe7a0a33ce7e3899fde7ba4193ec2c/app/controllers/Application.java - 'tobtc()' вызывает два веб-API. Недостатком является то, что каждый API не является полностью асинхронным и отбрасывает один рабочий поток, ожидая вызова HTTP HTTP. – ripper234

+0

Что-то должно слушать эти HTTP-вызовы WS, а в java это операция блокировки. Я не думаю, что у игры есть какой-то другой механизм для решения этой проблемы, другой, как это делается в отдельных потоках. Как я вижу, это может быть проблемой, если вы одновременно начинаете серьезное количество заданий. – aaberg

+0

У игры есть WS.url (url) .getAsync, и я хотел бы использовать продолжение для выполнения моего кода. Играть уже делает это по дизайну, чтобы сохранить рабочие потоки. – ripper234

Смежные вопросы