ايه الفرق بين وظيفتي 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` الناتجة. بس خليك على علم: لو استدعاء الارتجاع رمى بعض الأخطاء المميتة، فالمستقبل الناتج مش هيكم.