از Promise برای نوشتن action های asynchronous در Play Framework استفاده می شود. اگر action ها که نوع داده Result بر می گرداندند که در قالب promise به آنها رسیدگی نمی شد، می توانستند blocking باشند (برای مثال انجام یک عملیات سنگین پایگاه داده توسط action) اما اگر یک action نوع داده Promise<Result> برگرداند می توانیم action های non-blocking تولید کنیم و از action بسرعت خارج شویم حتی اگر آن action بخواهد عملیات سنگین پایگاه داده را ادامه دهد.
در اینگونه موارد thread جاری به کار دیگری مشغول می شود و کلاینت کماکان منتظر می ماند، به محض پایان یافتن عملیات سنگین action مورد نظر، Play Framework جواب را برای کلاینت منتظر مانده ارسال می کند.
برای تولید یک asynchronous action باید کد زیر را بنویسید:
public static Promise<Result> index() {
Promise<Integer> promiseOfInt = Promise.promise(
new Function0<Integer>() {
public Integer apply() {
return intensiveComputation();
}
}
);
return promiseOfInt.map(
new Function<Integer, Result>() {
public Result apply(Integer i) {
return ok("Got result: " + i);
}
}
);
}
اما در Play Framework لزومی ندارد به این سبک کد بنویسید چون action های Play Framework بصورت پیش فرض asynchronous هستند و بصورت داخلی با استفاده از promise به آنها رسیدگی می شود:
public static Result index() {
return ok("Got request " + request() + "!");
}
در حقیقت دو تکه کد بالا هر دو asynchronous هستند ولی در صورتی کد اول عملیات blocking انجام دهد، دیگر thread های مخصوص request handling در Play Framework مشغول نمی مانند و می تواند به سایر درخواست ها جواب دهد بنابراین سیستم می تواند درخواست های بیشتری را پاسخ دهد اما کد دوم در صورت blocking بودن یکی از thread های مخصوص request handling در Play Framework مشغول نگه می دارد.