Async: "تم تجاوز الحد الأقصى لحجم مكدس الاستدعاءات" باستخدام async.forEachLimit

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

async = require('async');

var documents = ['a', 'b', 'c', 'd', 'e', 'f'];

async.forEachLimit(documents, 2, function(item, callback) {
  console.log(".", item);
  callback(null);
}, function(err){
  console.log("end", err);
});

سجل

$ node test.js
. a
. a
. a
. a
. a
. a
end undefined
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
[...]

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
RangeError: Maximum call stack size exceeded

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

كنت أقوم بعملية مزامنة. أصلحته بالتغيير من:

callback();

ل

setTimeout(callback, 0);

ال 15 كومينتر

يبدو forEachLimit خطأ.

started += 1 running += 1

يجب تحريكه أمام استدعاء المكرر. يجب أيضًا تغيير $ # arr[started] إلى arr[started - 1]

ملاحظة: ستواجه هذا الخطأ فقط إذا كان الرمز الموجود داخل مكرر المكرر يستدعي رد الاتصال في نفس العلامة.

توقف عن استدعاء وظائف SYNC في async.js

لقد واجهت هذه المشكلة عندما كان لديّ return callback(null); مشروط في المكرر. كان هذا يعني أنني يجب أن أفعل الشيء الأكثر ذكاءً ، وهو تصفية المصفوفة باستخدام Array.filter قبل تطبيق async.forEach ، لذلك كان ذلك مفيدًا نوعًا ما ...

إذا كنت تعتقد أنه يجب عليك فعلاً ، يمكنك حل هذه المشكلة باستخدام process.nextTick(function() { callback(); }) .

jacobrask التي عملت بشكل جيد. شكرا

القيام بـ callback(null); متزامن. تحتاج إلى تسميته بشكل غير متزامن ، ala process.nextTick(callback) أو process.nextTick(function() { callback(null); }); . مثل bobrik قال ، توقف عن استدعاء وظائف المزامنة في غير متزامن :)

إن قول "إيقاف استدعاء وظائف المزامنة في وضع عدم التزامن" يفتقد إلى النقطة - إنه معطل ، ويبدو أن هذه مشكلة في forEachLimit فقط.

async.forEachLimit(['a','b'], 1, function(item, callback){
  if(something) {
    doStuff(function(){ callback(); });
  } else {
    callback();
  }
});

على الرغم من أنه يمكنني الحماية بسهولة من هذا المثال المحدد للغاية (كما ذكر jacobrask من خلال التصفية) ، فماذا لو قرر doStuff () (الذي قد يكون في مكتبة خارج سيطرتي) استدعاء رد الاتصال الخاص بي دون إجراء عملية.

لقد أضفت بعض التعليمات البرمجية لاستدعاء async.nextTick إذا اكتشف مكررًا متزامنًا والذي يجب أن يتجنب تجاوز سعة المكدس في هذه الحالات. ولكن بجدية ، توقف عن استدعاء وظائف المزامنة في ASYNC! ... اجعل وظائفك متزامنة باستمرار أو غير متزامنة باستمرار بدلاً من ذلك ؛)

حدث هذا أيضًا بالنسبة لي مع async.eachSeries .

يحدث أيضًا في mapLimit ، ونعم ، وظيفتي هي المزامنة لأنها وظيفة وهمية. ثم قمت بلفها بـ setImmediate ، حلت المشكلة.

حدث معي على async.forEachOfLimit

مواجهة نفس المشكلة مع async.waterfall .

async.queue أيضا بالطبع.

كنت أقوم بعملية مزامنة. أصلحته بالتغيير من:

callback();

ل

setTimeout(callback, 0);

حدث هذا لي عندما كنت ملتزمًا بوعد. شيء مثل:
async.forEach(items, (item:any, callback:Function) => { someAsyncPromise(item).then(() => { callback(); }).catch((err) => { //console error or something here callback(); }) });

يجب طرح catch قبل البتة غير المتزامنة في الوعد ، لأن هذا الخطأ يُلقى فقط عند حدوث استثناء في الوعد.

"

أتفهم أنه يجب علينا التوقف عن استدعاء وظائف المزامنة في الوضع غير المتزامن.

ولكن ، إذا كان استدعاء دالة المزامنة callback () داخل النص غير المتزامن أمرًا خاطئًا ، فلماذا تُظهر الوثائق غير المتزامنة ذلك في الأمثلة؟

هل يمكن لأي شخص مساعدتي في فهم الطريقة "المناسبة" للعمل مع الوحدة النمطية غير المتزامنة بدلاً من ذلك؟

فيما يلي مثال مباشر من الوثائق غير المتزامنة:

// assuming openFiles is an array of file names
async.each(openFiles, function(file, callback) {

    // Perform operation on file here.
    console.log('Processing file ' + file);

    if( file.length > 32 ) {
      console.log('This file name is too long');
      callback('File name too long');
    } else {
      // Do work to process file here
      console.log('File processed');
      callback();
    }
}, function(err) {
    // if any of the file processing produced an error, err would equal that error
    if( err ) {
      // One of the iterations produced an error.
      // All processing will now stop.
      console.log('A file failed to process');
    } else {
      console.log('All files have been processed successfully');
    }
});

https://caolan.github.io/async/docs.html#each

شكرا!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات