2013-08-06 13 views
5

Playframework का उपयोग कर, मैं कभी कभी इस स्थिति का सामना करना पड़ रहा हूँ:Playframework में स्कैला भविष्य का उपयोग?

def myFunction:Future[String] = { 
    // Do some stuff 
} 

myFunction.onComplete { 
    case Success(myString) => // Du Stuff 
    case Failure(error) => // Error handling 
} 

लेकिन जैसे स्काला दस्तावेज़ में कहा गया है, Future.onComplete एक यूनिट देता है। Action फ़ंक्शंस उदाहरण के लिए SimpleResult की अपेक्षा करते समय मैं Playframework में उन लोगों का उपयोग कैसे कर सकता हूं? फ्यूचर्स को संभालने के लिए सबसे अच्छे अभ्यास क्या हैं?

संपादित करें: मुझे जोड़ना चाहिए, मैं Play-2.2.x शाखा का उपयोग कर रहा हूं जिसने स्काला भविष्य के लिए Play भविष्य का व्यापार किया है।

+0

दिलचस्प लिंक @flavian, धन्यवाद। –

उत्तर

7

आप Async उपयोग कर सकते हैं:

def index = Action{ 
    val myFunction:Future[Option[String]] = // 
    Async{ 
     myFunction.map{ 
     case Some(x) => Ok(x) 
     case None => InternalServerError 
     } 
    } 
} 

मूल रूप से आपको बता दूँ कि खेलने: जब भी myFunction मूल्यांकन किया जाता है, उपयोगकर्ता के लिए वापस परिणाम लौटने। कॉलबैक का उपयोग करने के बजाय Future सामग्री पर यहां map पर चाल है, इससे आपको परिणाम पर काम करने की सुविधा मिलती है।

अद्भुत हिस्सा यह है कि यह अभी भी असीमित है। इस अर्थ में कि http अनुरोध थ्रेड मूल्यांकन सूचकांक अवरुद्ध नहीं होगा।

here पर कुछ दस्तावेज।

+0

क्या आप निश्चित हैं? जहां तक ​​मुझे पता है कि Async एक 'भविष्य [SimpleResult]' की अपेक्षा रखने वाला एक रैपर है, जबकि 'पूर्ण' एक यूनिट देता है। इसे संकलित नहीं करना। और मुझे जोड़ना चाहिए था कि मैं Play 2.2.0-M2 का उपयोग कर रहा हूं जिसने देशी स्काला फ्यूचर्स द्वारा Play's Futures को स्विच किया है। –

+0

कोड संपादित किया गया, – Jatin

1

प्ले (2.1 में कम से कम) एक extend1 विधि है कि आप उपयोगी लग सकते जोड़ता है:

def myFunction: Future[String] = ??? 

myFunction.extend1 { 
    case Redeemed(v) => s"Got result string: $v" 
    case Thrown(t) => s"Got throwable: ${t.getMessage}" 
} // : Future[String] 

यह शायद बेहतर है, हालांकि, संगणना कि स्पष्ट रूप से असफल है, जैसे का उपयोग कर Option (जैसा कि जेटिन दर्शाता है), Either, या scalaz.\/

संपादित करें: जैसा कि आप इंगित करते हैं, PlayPromise Play 2.2 में बहिष्कृत है। यह उदाहरण के लिए, Future तरीकों के साथ अपने व्यवहार का अनुकरण करने की तुच्छ है:

myFunction.map(v => s"Got result string: $v").recover { 
    case t => s"Got throwable: ${t.getMessage}" 
} 

आप extend1 वाक्य रचना यह उचित implicits जोड़ने के लिए आसान होगा बनाना चाहता है तो।

+0

से पहले के लिए क्षमा करें, वास्तव में, '2.2' से पहले के संस्करणों में, मैंने '.extend1' का उपयोग किया, हालांकि हस्ताक्षर' scala.concurrent.Future' के साथ असंगत है। –

+0

मैंने अपना जवाब संपादित करने के तरीकों में से एक को शामिल करने के लिए संपादित किया है। उदाहरण के लिए, आप एक नया 'वादा' बना सकते हैं, इसे 'पूर्ण' ब्लॉक में फ़ीड कर सकते हैं और अपना 'भविष्य' वापस कर सकते हैं। – Hugh

संबंधित मुद्दे