تقريبا جميع الأماكن في العقدة حيث يتم استخدام وظائف رد الاتصال غير متزامنة. من المحتمل أن يتم تنفيذ الكود وراء وظائف رد الاتصال أولاً من الرمز في وظائف رد الاتصال ، وخاصة عمليات قاعدة البيانات. بالطبع ، توفر العقدة أيضًا وظائف للإصدارات المتزامنة ، مثل عمليات الملفات. Fs.ReadFilesync () هو النسخة المتزامنة من fs.readfile ().
لذا فإن السؤال هو ، هل foreach () غير متزامن؟ من الناحية المنطقية ، إذا لم تتم إضافة المزامنة ، فيجب أن يكون غير متزامن.
نسخة الكود كما يلي:
var arr = ['a' ، 'b' ، 'c'] ؛
var str = '123' ؛
arr.foreach (وظيفة (عنصر) {
str += عنصر ؛
بينما (صحيح) {} ؛ // استخدم حلقة ميتة للتعلق بها ~~
}) ؛
console.log (str) ؛
قم بتشغيل الرمز أعلاه وينتهي الأمر بالتعليق ، دون أي إخراج. .
لذلك ، يتم مزامنة foreach () في العقدة! !
عندما استخدمت العقدة لأول مرة ، لم أفكر في هذه المشكلة ، لذلك كتبتها بشكل متزامن. اعتقدت فجأة أنه بعد الاختبار ، شعرت بالصدمة واعتقدت أن الكود السابق قد كتب بشكل غير صحيح.
إذا كان في بعض الحالات ، يجب معالجة Foreach بشكل غير متزامن ، Google IT وهناك مجموعة عقدة ، يمكنك تجربتها ~~ portal: https://github.com/cfsghost/node-array
تم إنشاء هذا العمل بواسطة http://www.cnblogs.com/imyzf