आप इसके बजाय निम्न के लिए एक समझ का उपयोग कर सकते हैं:
val fut1 = Future{...}
val fut2 = Future{...}
val fut3 = Future{...}
val aggFut = for{
f1Result <- fut1
f2Result <- fut2
f3Result <- fut3
} yield (f1Result, f2Result, f3Result)
इस उदाहरण में, वायदा 1, 2 और 3 को समानांतर में बंद किया गया है। फिर, समझ के लिए, हम 1 और फिर 2 और फिर 3 उपलब्ध होने तक इंतजार करते हैं। यदि 1 या 2 विफल रहता है, तो हम 3 के लिए और इंतजार नहीं करेंगे। यदि सभी 3 सफल होते हैं, तो aggFut
वैल 3 फ्यूचर्स के परिणामों के अनुरूप 3 स्लॉट्स के साथ एक टपल पकड़ लेगा।
अब अगर आपको उस व्यवहार की ज़रूरत है जहाँ आप रुकना चाहते हैं अगर कहते हैं कि fut2 पहले विफल हो जाता है, तो चीजें थोड़ी पेचीदा हो जाती हैं। उपरोक्त उदाहरण में, आपको fut2 के विफल होने से पहले पूर्ण करने के लिए fut1 का इंतजार करना होगा। इसे हल करने के लिए, आप कुछ इस तरह की कोशिश कर सकते हैं:
val fut1 = Future{Thread.sleep(3000);1}
val fut2 = Promise.failed(new RuntimeException("boo")).future
val fut3 = Future{Thread.sleep(1000);3}
def processFutures(futures:Map[Int,Future[Int]], values:List[Any], prom:Promise[List[Any]]):Future[List[Any]] = {
val fut = if (futures.size == 1) futures.head._2
else Future.firstCompletedOf(futures.values)
fut onComplete{
case Success(value) if (futures.size == 1)=>
prom.success(value :: values)
case Success(value) =>
processFutures(futures - value, value :: values, prom)
case Failure(ex) => prom.failure(ex)
}
prom.future
}
val aggFut = processFutures(Map(1 -> fut1, 2 -> fut2, 3 -> fut3), List(), Promise[List[Any]]())
aggFut onComplete{
case value => println(value)
}
अब यह सही ढंग से काम करता है, लेकिन यह मुद्दा यह जानने से आता है कि कौन Future
से Map
को सफलतापूर्वक पूरा किया जाए। जब तक आपके पास भविष्य के साथ परिणाम को ठीक से सहसंबंधित करने का कोई रास्ता होता है, तब तक यह परिणाम सामने आ जाता है, तब कुछ इस तरह से काम करता है। यह केवल पुनरावर्ती रूप से पूर्ण किए गए फ़्यूचर्स को मैप से निकालता रहता है और तब तक Future.firstCompletedOf
शेष पर कॉल करता रहता है Futures
जब तक कि कोई भी नहीं बचा है, परिणाम को रास्ते में एकत्रित करता है। यह सुंदर नहीं है, लेकिन अगर आपको वास्तव में उस व्यवहार की आवश्यकता है जिसके बारे में आप बात कर रहे हैं, तो यह, या ऐसा ही कुछ काम कर सकता है।