Async: Jede Serie mit einem verschachtelten asynchronen Aufruf führt dazu, dass die maximale Größe des Aufrufstapels überschritten wird

Erstellt am 10. Aug. 2016  ·  3Kommentare  ·  Quelle: caolan/async

Welche asynchrone Version verwenden Sie?

2.0.1

In welcher Umgebung ist das Problem aufgetreten (Knotenversion / Browserversion)

Knoten 6.2.1
NPM 3.9.3

Was hast du gemacht?

let counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        pCb();
      },
    ], cb);
  },
  () => console.log('done')
);

Was hast du erwartet?

Ich habe erwartet, dass jede der Iterationen auftritt, was dazu führen würde, dass die letzten beiden console.log '1' und 'done' sind.

Was war das tatsächliche Ergebnis?

Nach weniger als 1000 Iterationen würde ich diesen Fehler erhalten:

RangeError: Maximale Aufrufstapelgröße überschritten

Als ich zu Async 1.5.2 zurückkehrte, funktionierte der obige Code wie erwartet.

question

Hilfreichster Kommentar

Der Grund, warum dies in Async 1.5.2 funktioniert hat, ist, dass wir sichergestellt haben, dass der Rückruf in dieser Version immer asynchron aufgerufen wurde. In Version 2 haben wir diesen Schutz entfernt (siehe https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions).

In Ihrem Fall können Sie zum Beheben des Skripts entweder async.ensureAsync(cb) oder async.setImmediate(cb) , um das Rekursionsproblem zu umgehen:

var counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        async.setImmediate(pCb);
      },
    ], cb);
  },
  () => console.log('done')
);

Alle 3 Kommentare

+1

+1

Der Grund, warum dies in Async 1.5.2 funktioniert hat, ist, dass wir sichergestellt haben, dass der Rückruf in dieser Version immer asynchron aufgerufen wurde. In Version 2 haben wir diesen Schutz entfernt (siehe https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions).

In Ihrem Fall können Sie zum Beheben des Skripts entweder async.ensureAsync(cb) oder async.setImmediate(cb) , um das Rekursionsproblem zu umgehen:

var counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        async.setImmediate(pCb);
      },
    ], cb);
  },
  () => console.log('done')
);
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen