Пользовательский JSON.stringify не в состоянии Stringify объекта в целом, но работает, когда повторяется на один уровень глубиной - PullRequest
3 голосов
/ 06 мая 2011

Надеясь, что кто-то может обнаружить ошибку, потому что у меня проблемы

Хорошо, я создал свой собственный JSON.stringify только для больших пользовательских объектов. Это может быть не совсем в спецификации для некоторых вещей в крайнем случае, но предназначено только для разметки больших объектов, которые я создаю сам.

Ну, это работает, и работает хорошо для большинства объектов, но у меня есть объект, который я пытаюсь преобразовать в строку, и он выходит из строя и печатает его перед выходом:

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
undefined

Не очень полезно. Объект в порядке, потому что обычный вызов JSON.stringify(object) работает нормально, и когда я перебираю объект с for (var x in obj) if (obj.hasOwnProperty(x)) { myStringify(obj); }, это нормально, но если я вызываю его на верхнем уровне объекта, он попадает в ад ... Это на самом деле не имеет смысла, и единственное, о чем я могу думать, это уровень, если рекурсия как-то нарушает что-то ...

Анализатор: https://gist.github.com/958776 - Струнная функция, которую я вызываю
ObjectIterator.js: https://gist.github.com/958777 - в основном для обеспечения асинхронной итерации

Редактировать Итак, я перебрал объект на один уровень глубиной и сравнил полученную строку со строкой JSON.stringify(sameLevelDeep), и они равны. Поскольку выходные данные равны, я не уверен, что это то, как я что-то анализирую, но возможно, что это такой большой объект или количество рекурсии такое большое?

Редактировать 2 Итак, я "решил" проблему, я думаю. Вместо того, чтобы каждую 25-ю итерацию отправлять в следующий цикл событий, я нажимаю каждую пятую. Я не уверен, почему это будет иметь значение, но это делает ... Я предполагаю, что вопрос сейчас "Почему это имеет значение"?

1 Ответ

0 голосов
/ 22 августа 2011

Хорошо, кроме того, что это очень специфический вопрос, помогающий очень конкретному человеку, я хотел бы перенести это в другое место, которое также могло бы устранить вашу проблему и, возможно, помочь другим.

Поскольку вы не указываете, почему вы проходите этот процесс, мне придется разбить его и угадать - и предоставить решение для каждой угаданной идеи.

1. (Браузер) Вы пытаетесь использовать JavaScript для обработки данных и предоставления пользователю результата

Загрузка на веб-страницу не менее нескольких мегабайт необработанных данных (« некоторые из этих объектов имеют 5–10 миллионов символов») для обработки и отображения результата далеко не оптимальна, возможно, вам следует это сделать операция на стороне сервера и загрузка предварительно рассчитанного результата.

Кроме того, независимо от того, что вы делаете, JavaScript не поддерживает потоки. setTimeout(1, function() { JSON.stringify(data); }); не должно сильно отличаться от того, что вы делаете.

2. (Браузер) Вы пытаетесь отобразить загруженный контент

Вы должны попытаться загрузить меньшие порции вместо всего содержимого в 10 и более миллионов символов, используя встроенный метод JSON.stringify.

3. (Без браузера) Вы пытаетесь использовать JavaScript для приложения, требующего многопоточности

Вам следует рассмотреть возможность использования другого языка программирования для этого приложения.

В итоге

Я думаю, что вы взбираетесь не на ту гору, вы можете достичь того же, обходя ее, не потея. Если вы хотите подняться на гору для ударов ногами, есть горы, которые нуждаются в этом, но это не эта.

Перевод: Работайте над архитектурой, чтобы устареть препятствие вместо того, чтобы пытаться его решить, если вы хотите решить проблему, есть проблемы, которые требуют решения - но не это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...