ما هو إصدار غير متزامن الذي تستخدمه؟
2.0.1
ما البيئة التي حدثت فيها المشكلة في (إصدار العقدة / إصدار المتصفح)
العقدة 6.2.1
NPM 3.9.3
ما الذي فعلته؟
let counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
pCb();
},
], cb);
},
() => console.log('done')
);
ماذا تتوقع أن يحدث؟
كنت أتوقع حدوث كل التكرارات ، مما سيؤدي إلى أن تكون آخرتي console.log هي "1" و "تم".
ماذا كانت النتيجة الفعلية؟
بعد أقل من 1000 تكرار ، سأتلقى هذا الخطأ:
RangeError: تم تجاوز الحد الأقصى لحجم مكدس الاستدعاءات
عندما عدت إلى غير المتزامن 1.5.2 ، عمل الكود أعلاه كما هو متوقع.
+1
+1
السبب وراء نجاح هذا في عدم التزامن 1.5.2 هو أننا تأكدنا من استدعاء رد الاتصال دائمًا بشكل غير متزامن في هذا الإصدار. في الإصدار 2 أزلنا هذا الحارس (انظر https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
لذلك في حالتك لإصلاح البرنامج النصي ، يمكنك إما استخدام async.ensureAsync(cb)
أو async.setImmediate(cb)
للتغلب على مشكلة العودية:
var counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
async.setImmediate(pCb);
},
], cb);
},
() => console.log('done')
);
التعليق الأكثر فائدة
السبب وراء نجاح هذا في عدم التزامن 1.5.2 هو أننا تأكدنا من استدعاء رد الاتصال دائمًا بشكل غير متزامن في هذا الإصدار. في الإصدار 2 أزلنا هذا الحارس (انظر https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
لذلك في حالتك لإصلاح البرنامج النصي ، يمكنك إما استخدام
async.ensureAsync(cb)
أوasync.setImmediate(cb)
للتغلب على مشكلة العودية: