2015-09-10 2 views
0

Я хотел бы создать метод в controlller, который будет ждать, пока я не приведу правильные данные из базы данных. Я знаю, что я должен использовать протокол Promise, я не знаю, как заставить это обещание дождитесь записи db.метод контроллера блока до получения результата db

я хочу коснуться, как это:

public static F.Promise<Result> getData(long userId) { 

getIngormationFromDb(); 
while(informationFetched){ 
    return F.Promise.pure(ok(multimediaJSON)); 
    if(duration > 10 seconds) { 
     return F.Promise.pure(badRequest()); 
    } 
} 
} 

Можно ли добиться чего-то подобного?

ответ

2

Следующий код будет работать, как вы хотите, однако действие будет заблокировано во время ее выполнения:

public static Promise<Result> getData(long userId) { 
    try { 
     return promise(() -> { 
      return getIngormationFromDb(); 
     }).map(ingormationFromDbResult -> { 
      return ok(ingormationFromDbResult); 
     }).get(10_000); 
    } catch (F.PromiseTimeoutException e) { 
     return Promise.pure(badRequest()); 
    } 
} 

Таким образом, рекомендуется выполнить блокирующий код в отдельном контексте выполнения (тайм-аут должен контролироваться на на стороне клиента):

public static Promise<Result> getData(long userId) { 
    return promise(() -> { 
     return getIngormationFromDb(); 
    }, separateExecutionContext).map(ingormationFromDbResult -> { 
     return ok(ingormationFromDbResult); 
    }); 
} 

Вы можете найти более подробную информацию в documenation здесь https://www.playframework.com/documentation/2.3.x/JavaAsync

+0

я использовал \t Promise prom = Promise.delayed (() -> { return ok (json or something}, 2, TimeUnit.SECONDS); –

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