Async: تؤدي كل سلسلة مع استدعاء غير متزامن متزامن إلى تجاوز الحد الأقصى لحجم مكدس الاستدعاءات

تم إنشاؤها على ١٠ أغسطس ٢٠١٦  ·  3تعليقات  ·  مصدر: caolan/async

ما هو إصدار غير متزامن الذي تستخدمه؟

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 ، عمل الكود أعلاه كما هو متوقع.

question

التعليق الأكثر فائدة

السبب وراء نجاح هذا في عدم التزامن 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')
);

ال 3 كومينتر

+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')
);
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات