في الشيفرة المُقدمة، يتم استخدام مفهومين مهمين في JavaScript: الوعود (Promises) والدوال. يستخدم الكود الوعود لإدارة التنفيذ الغير متزامن (Asynchronous)، ويُظهر كيف يمكن استخدام الدوال لتحكم في تدفق البيانات.
أولاً، يُعرف في الكود دالة getY(x)
التي تقوم بإرجاع وعد (Promise). هذه الوعدة تحتوي على دالة تأخير (setTimeout) التي تنتظر 100 ميلي ثانية قبل أن تستدعي دالة الحل (resolve) وتقوم بتمرير القيمة (3 * x) – 1 إليها.
ثانيًا، تعرف دالة foo(bar, baz)
، حيث يتم فيها حساب قيمة x
التي تمثل حاصل ضرب bar
و baz
، ومن ثم يُرجع مصفوفة من وعود. الوعد الأول يُحل بقيمة x
، بينما الوعد الثاني يُحل بنتيجة دالة getY(x)
.
ثالثاً، تعرف دالة spread(fn)
التي تعيد دالة جديدة مرتبطة بالوسيط (bound) تستدعي fn
وتمرر لها الوسيط null
. هذا يعني أنه عند استدعاء الدالة المُعادة من spread
، سيتم تمرير الوسيط null
كالمُعد للدالة المُنطوية fn
.
أخيرًا، تستخدم Promise.all()
لتنفيذ جميع الوعود الموجودة في مصفوفة الوعود التي تم إرجاعها من foo(10, 20)
، وبعد حلها بنجاح، يتم استدعاء دالة spread()
مع دالة callback التي تقوم بطباعة قيمتي x
و y
المحلولة من الوعود.
بشكل مبسط، عندما يتم استدعاء spread()
مع دالة callback المحددة، يُنشئ المُنظر Function.apply.bind
دالة جديدة مرتبطة بالوسيط تنفذ الدالة callback المعطاة لها، وتقوم بتمرير الوسيط null
للدالة callback، مما يتيح للدالة callback الوصول إلى قيم x
و y
المحسوبة بشكل صحيح من الوعود المُستوفاة.
المزيد من المعلومات
بالطبع، دعنا نواصل تحليل وشرح الشيفرة بمزيد من التفاصيل.
عندما يُستدعى spread()
ويُمرر إليها الدالة callback التي تستقبل x
و y
، يتم إنشاء نظر (wrapper) جديد لهذه الدالة باستخدام Function.apply.bind
. لكي نفهم كيف يحدث ذلك، دعنا نقوم بتفكيك هذه العملية:
-
Function.apply
هي دالة في JavaScript تُستخدم لتنفيذ دالة مع وسيط معين ومصفوفة من الوسائط كمعطيات. يتم تحديد الدالة المراد تنفيذها باستخدامthis
الذي يتم تمريره لـapply
. -
bind
هو طريقة تُستخدم لربط قيمة معينة بـthis
في دالة محددة، مما يؤدي إلى إنشاء نظر جديد للدالة معthis
الجديد.
بالتالي، باستخدام Function.apply.bind
، نقوم بربط null
كقيمة this
مع Function.apply
، مما يعني أنه عند استدعاء الدالة المنشأة، فإن this
سيكون null
. ومن ثم، عندما تُستدعى الدالة المُنشأة مع وسيطين (الدالة callback و null
)، يُقوم apply
بتنفيذ الدالة callback وتمرير null
كقيمة this
.
بهذه الطريقة، عندما تحل الوعود في Promise.all()
، يتم استدعاء الدالة المنشأة من spread()
، والتي تقوم بتنفيذ الدالة callback التي تم تمريرها لها، وتمرير null
كقيمة this
. ونظرًا لأن الدالة callback مربوطة مع null
باستخدام Function.apply.bind
، فإنها تتمكن من الوصول إلى الوسيطين x
و y
بشكل صحيح.
لذا، في النهاية، عندما يُستدعى spread()
، يُنشئ ويُقيِّد نظرٌ جديد للدالة callback، والتي بدورها تستقبل x
و y
، وهذا يسمح لنا بالوصول إلى قيم x
و y
التي تم حسابها من الوعود المُستوفاة بنجاح.