Когда проект, который стабильно работал в сети больше года, вдруг падает.

Предисловие

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

Внезапно в срочном сообщении говорилось, что ошибка должна быть исправлена ​​как можно скорее.

● [Босс] с тревогой сказал: «Толстяк, что-то не так с вашим кодом. Страница пользователя зависла. Теперь это возвращается в службу поддержки клиентов. Пожалуйста, взгляните».

● [Я] удивился: «Не должно быть. Этот код находится в сети уже больше года, проблем не возникало, и в последнее время он не менялся».

Всем привет. Делюсь достоверной и интересной историей. Несколько дней назад внезапно произошел сбой проекта, стабильно работавшего в сети более года. Проверив, я обнаружил, что отправителем этого кода был я сам, но после тщательного рассмотрения проблему не обнаружил.

Обнаружить проблемы

После упрощения и удаления кода оставить такой кусок кода может быть проблематично.

getValuesById заключается в получении массива на основе id. Здесь в силу специфики бизнеса необходимо объединить два массива. На самом деле существует множество способов объединения массивов. В то время я решил использовать push.

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

По какой причине могут возникать проблемы в коде проекта, стабильно работающего более года? Единственное изменение — это время. Что изменит время? Это потому, что проект работает уже давно, и объем данных здесь стал больше, что привело к взрыву стека?

Поэтому я быстро смоделировал работу этого кода, когда было много вопросов по данным:

Стек фактически взорвался, а затем страница разбилась!

Почему этот код лопается? Это из-за push или оператора расширения? Чтобы выяснить основную причину, я выполнил преобразование Babel для этого кода ES6. Результат:

Вы можете видеть, что этот код, наконец, становится push apply(values, newValues).

Изучив соответствующие материалы, я узнал, что если вызвать apply вышеописанным способом, то это может превысить длину параметров движка JavaScript и что переданные здесь избыточные параметры будут вести себя по-разному в разных движках JavaScript. Из-за этого ограничения некоторые движки будут генерировать исключения и даже вызывать потерю параметров.

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

Решать проблему

Существует множество способов объединения массивов. Мы можем изменить подходящий метод.

  1. Слияние с помощью concat.

2. Слияние с использованием оператора расширения (используется чаще).

3. Петля толчок.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord. Заинтересованы в Взлом роста? Ознакомьтесь с разделом Схема.