Jest to część kodu, aby kontynuować dużą liczbę wpisów (pierwotnie działa z systemem plików i dokonać pewnych operacji z plikami). Czy jest jakiś ładny sposób na ominięcie ograniczenia i zapobieganie rzucaniu RangeError: Maksymalny rozmiar stosu połączenia przekroczony (Na razie pozwala mi to iterować około 3000 pozycji)

var async = require('async')
    , _u = require('underscore')

var tifPreview = function (item, callback) {
    console.log(item)
    return callback();
}

var tifQueue = async.queue(tifPreview, 2)

tifQueue.push(_u.range(0, 5000, 1))
11
Alber 27 listopad 2013, 17:35

2 odpowiedzi

Najlepsza odpowiedź

Problem polega na tym, że podejmujesz wiele połączeń funkcyjnych. Ustawianie stack-size do wyższej wartości zwiększy tylko liczbę przedmiotów, które możesz sobie poradzić, nie rozwiązać rzeczywistego problemu.

Dzwonisz do następnej iteracji prosto z funkcji, co czyni go rekurencyjną funkcją. Trochę trudno jest zauważyć, ponieważ idzie thru async.

Ten kod powinien działać:

var tifPreview = function (item, callback) {
  console.log(item);

  // defer the callback
  setImmediate(callback);
}

Przeczytaj więcej o funkcji setImmediate tutaj: http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg

23
georgephillips 21 wrzesień 2014, 01:35

Opcja może zostać przekazana --max-stack-size do node.

node --max-stack-size 32000 app.js

W celach informacyjnych użyj node -h

--max-stack-size=val Ustaw max v8 stos stos (bajty)

Aktualizacja

Nawet jeśli pomóż mu wydrukować jako --max-stack-size, w node -v v0.10.x + Musisz użyć --stack-size.

node --stack-size=32000 app.js
23
bevacqua 27 listopad 2013, 13:58