شو الفرق بين وظائف Scala Future onComplete و andThen؟
كل من `andThen` و `onComplete` بتسمحلك تشوف نتيجة بعض المستقبل عن طريق وظيفة استدعاء. وبالرغم من كدا، `andThen` بيقدر يكون مسلسل، وبخلاف `onComplete`، بيضمن الترتيب اللي بتتطبق فيه وظائف الاستدعاء. وبالإضافة، المكالمة العائدة اللي بتتعطى لـ `andThen` ممكن تكون وظيفة جزئية، بتتعامل بس مع مجموعة فرعية من النتائج (مثلاً، بس `Success` أو بس `Failure`).  فكر بالنموذج التالي باستخدام `andThen` و `map`:  ̅̅̅̅̅ def demoAndThen(fut: Future[Int]): Future[Int] = { fut.andThen { case Success ((value) => println ((s"andThen1: $value") } .andThen { case Success ((value) => println ((s"andThen2: $value") } . {map i => println ((s"map: $i") أنا } } ̅̅̅̅̅  لما `fut` يكمل بنجاح، "و بعدين1:..."، "و بعدين2:..." و "خريطة:..." رح يطبعوا بالترتيب ده.  فكر بالنموذج المماثل باستخدام `onComplete` و `map`:  ̅̅̅̅̅ defOnComplete ((fut: Future[Int]): Future[Int] = { futonComplete { t: Try[Int] => println(s"onComplete1: $t") } futonComplete { t: Try[Int] => println(s"onComplete2: $t") } fut.map { i => println ((s"map: $i") أنا } } ̅̅̅̅̅  في الحالة دي، لما `fut` يكمل بنجاح، "onComplete1:..."، "onComplete2:..." و "map:..." رح يطبعوا بترتيب مش محدد.  بالرغم من إن `andThen` مسلسلة، وظيفة الإستدعاء عادة ما بتؤثر على نتيجة `Future` الناتج. بس خلي بالك: اذا المكالمة التالية خلصت لبعض الأخطاء المميتة، فالمستقبل اللي من خلاله ما رح يكمل.