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.
+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')
);
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)
oderasync.setImmediate(cb)
, um das Rekursionsproblem zu umgehen: