لماذا تواصل وعود جافاسكريبت ES6 التنفيذ بعد الحل؟
كما أفهم، فإن القسم هو شيء قد يقوم بعملية حل() أو رفض()، لكنني صُدمت عندما اكتشفت أن الشيفرة في القسم تستمر في التنفيذ بعد استدعاء عملية الحل أو الرفض.
تأملت في ما إذا كان يجب قبول أو رفض كونه نسخة متوافقة مع التعامل غير المتزامن من وظيفة المغادرة أو الرجوع، التي ستوقف تنفيذ كل وظيفة إرشادية.
هل يمكن لأحد أن يوضح السبب وراء السبب في أن المثال التالي يظهر أحيانًا console.log بعد نداء resolve:
var fizz=function() { return new Wibble(function(wobble, flarb) { wobble(); console.log("أداء خدع إضافية، لا ينبغي أن تظهر بعد ووبل!"); }); };
fizz().then(function() { console.log("ارتجف"); });
الإجابة رقم 1
لدى JavaScript مفهوم "التشغيل حتى الاكتمال". ما لم يتم رمي خطأ، يتم تنفيذ الدالة حتى يتم الوصول إلى جملة return أو نهاية الدالة. لا يمكن للكود الآخر خارج الدالة التدخل في ذلك (إلا، مرة أخرى، إذا تم رمي خطأ).
إذا كنت تريد من resolve() الخروج من دالتك المُهيئة، يجب أن تسبقها بـ return:
return new Promise(function(resolve, reject) {
return resolve();
console.log("Not doing more stuff after a return statement");
});
الإجابة رقم 2
إن ردود الاستدعاء التي سيتم استدعاؤها عند قيامك بـ resolve للوعد لا تزال مطلوبة بموجب المواصفات ليتم استدعاؤها بشكل غير متزامن. هذا لضمان سلوك متسق عند استخدام الوعود لمزيج من الإجراءات المتزامنة وغير المتزامنة.
لذلك عندما تستدعي resolve يتم وضع رد الاتصال في قائمة الانتظار، وتستمر تنفيذ الدالة فورًا مع أي كود يتبع استدعاء resolve().
لا يمكن إزالة رد الاتصال من الطابور وتشغيله فعليًا إلا بعد أن يُعاد التحكم إلى حلقة أحداث JS.
