Async: eachSeries dengan panggilan asinkron bertingkat menghasilkan ukuran tumpukan panggilan maksimum terlampaui

Dibuat pada 10 Agu 2016  ·  3Komentar  ·  Sumber: caolan/async

Versi asinkron apa yang Anda gunakan?

2.0.1

Di lingkungan mana masalah terjadi (Versi node / versi browser)

Node 6.2.1
NPM 3.9.3

Apa yang kamu lakukan?

let counter = 2000;

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

Apa yang Anda harapkan terjadi?

Saya mengharapkan setiap iterasi terjadi, yang akan menghasilkan dua console.log terakhir menjadi '1' dan 'done'.

Apa hasil sebenarnya?

Setelah kurang dari 1000 iterasi, saya akan menerima kesalahan ini:

RangeError: Ukuran tumpukan panggilan maksimum terlampaui

Ketika saya kembali ke async 1.5.2, kode di atas berfungsi seperti yang diharapkan.

question

Komentar yang paling membantu

Alasan ini berfungsi di async 1.5.2 adalah kami memastikan callback selalu dipanggil secara asinkron dalam versi itu. Di versi 2 kami menghapus pelindung ini (lihat https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)

Jadi dalam kasus Anda untuk memperbaiki skrip, Anda dapat menggunakan async.ensureAsync(cb) atau async.setImmediate(cb) untuk mengatasi masalah rekursi:

var counter = 2000;

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

Semua 3 komentar

+1

+1

Alasan ini berfungsi di async 1.5.2 adalah kami memastikan callback selalu dipanggil secara asinkron dalam versi itu. Di versi 2 kami menghapus pelindung ini (lihat https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)

Jadi dalam kasus Anda untuk memperbaiki skrip, Anda dapat menggunakan async.ensureAsync(cb) atau async.setImmediate(cb) untuk mengatasi masalah rekursi:

var counter = 2000;

async.eachSeries(
  new Array(counter),
  (item, cb) => {
    async.parallel([
      (pCb) => {
        console.log(counter--);
        async.setImmediate(pCb);
      },
    ], cb);
  },
  () => console.log('done')
);
Apakah halaman ini membantu?
0 / 5 - 0 peringkat