لقد لاحظت هذا أثناء محاولتي معرفة سبب تسبب توقف وقت النظام في فشل كتابة csv. اتضح أن المكتبة لديها مكالمة setImmediate
تم حظرها: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18
يبدو أن هناك مجموعة من المكتبات التي تعتمد على setImmediate
للأشياء غير الضارة ، وأن تزييف setImmediate
يؤدي إلى سلوك غير متوقع فيها جميعًا:
ربما يكون من غير المعقول توقع أن توقف وقت النظام لا يؤدي إلى فشل كتابة csv؟ في هذه الحالة ، من الصعب التعقب بشكل خاص ، لأنه في Javascript لا يمكنك فقط الضغط على ctrl+c
والحصول على تتبع مكدس يوضح لك الخطأ الذي حدث. استغرق الأمر حوالي 90 دقيقة فقط لتحديد أي جزء من الشفرة كان متجمدًا ، ثم لفهم سبب مسؤولية sinon.
لست متأكدًا مما يجب أن يكون عليه الإصلاح ، ولكن يبدو أنه يؤثر على الكثير من المكتبات ، وقد استجابت واحدة منها على الأقل من خلال إنشاء نسختها الخاصة من setImmediate
والتي لا يمكن تشويهها.
إذا كانت الإجابة هي أنني يجب أن أتصل بـ useFakeTimers(0, "Date")
، فربما يجب أن يكون هذا هو الخيار الافتراضي؟ ربما يتناسب ذلك بشكل أفضل مع توقعاتي / توقعات الناس حول كيف يتصرف العالم؟
لست متأكدًا مما يجب أن يكون عليه الإصلاح ، ولكن يبدو أنه يؤثر على الكثير من المكتبات ، وقد استجابت واحدة منها على الأقل من خلال إنشاء نسختها الخاصة من setImmediate التي لا يمكن تشويهها.
هذا هو الحل الموصى به عند استخدام setTimeout ، قم بتعيين فوري لتأثير الحصول على مكدس مكالمات جديد (وليس للتحكم في الوقت).
نعم ، لقد أمضيت 90 دقيقة للتو في تشخيص هذا الأمر وإصلاحه في قاعدة بيانات تجارية.
على الأقل ، يجب أن تذكر المستندات أن setImmediate ستكون مزيفة.
للرجوع إليها في المستقبل ، يتيح لك هذا النموذج من الوظيفة الآن تحديد الوظائف المزيفة:
var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);
Sets the clock start timestamp and names functions to fake.
Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.
لذلك أدى هذا إلى حل المشكلة بالنسبة لي عند العمل مع express:
clock = sinon.useFakeTimers(1495020000, 'Date');
تشرح الوثائق هذا الآن: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock - sinonusefaketimersnow-prop1-prop2-
التعليق الأكثر فائدة
للرجوع إليها في المستقبل ، يتيح لك هذا النموذج من الوظيفة الآن تحديد الوظائف المزيفة:
لذلك أدى هذا إلى حل المشكلة بالنسبة لي عند العمل مع express: