+1 امتیاز
قبل در برنامه نویسی توسط (7.2هزار امتیاز)
تفاوت Promise و Result در Play framework چیست؟ با توجه به این که در نسخه 2.3 ، برخی از APIهای Play framework با Promise به جای Result کار می کنند، چگونه می توان یک Result را به Promise تبدیل کرد؟

1 پاسخ

+1 امتیاز
قبل توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

از 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 مشغول نگه می دارد.

سوالات مشابه

0 امتیاز
1 پاسخ 138 بازدید
+1 امتیاز
1 پاسخ 330 بازدید
+1 امتیاز
1 پاسخ 236 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط asg.mojtaba (1.2هزار امتیاز)
+1 امتیاز
1 پاسخ 341 بازدید
+1 امتیاز
1 پاسخ 350 بازدید
0 امتیاز
1 پاسخ 272 بازدید
+1 امتیاز
1 پاسخ 502 بازدید
0 امتیاز
1 پاسخ 364 بازدید
...