شو الفرق بين وظائف سكالا فيوتشر أون كومبليت و أند ثين؟
كل من `andThen` و `onComplete` بيسمح لك بمراقبة نتيجة بعض المستقبل عن طريق وظيفة استدعاء. وبالرغم من كده، `andThen` ممكن يرتب، وبدلا من `onComplete`، بضمان ترتيب تطبيق وظائف الاستدعاء. بالإضافة، الإستدعاء المرجعي لـ `andThen` ممكن يكون وظيفة جزئية، بتتعامل فقط مع مجموعة فرعية من النتائج (مثلاً، فقط `Success` أو فقط `Failure`).  فكر في المثال التالي باستخدام `andThen` و `map`:  ` `` def demoAndThen(fut: Future[Int]): Future[Int] = { fut.andThen { حالة نجاح (قيمة) => println (قيمة) } .andThen { حالة نجاح (قيمة) => println (قيمة) } . { map i => println ((s"map: $i") أنا   ` ``  لما `fut` يكمل بنجاح، "و بعدين1:... "، "و بعدين2:... " و "خريطة:... " رح يطبعوا بالترتيب ده.  فكر بالنموذج المماثل باستخدام ∀onComplete∀ و ∀map∀:  ` `` def demoOnComplete ((fut: Future[Int]): Future[Int] = { fut.onComplete { 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` الناتج. بس خلي بالك: اذا المكالمة الراجعة خلقت بعض الأخطاء المميتة، فالمستقبل اللي بنتج منه مش هيكمل.