Когда проект, который стабильно работал в сети больше года, вдруг падает.
Предисловие
Вечером выходного дня я лежал на диване перед телевизором и наслаждался досугом.
Внезапно в срочном сообщении говорилось, что ошибка должна быть исправлена как можно скорее.
● [Босс] с тревогой сказал: «Толстяк, что-то не так с вашим кодом. Страница пользователя зависла. Теперь это возвращается в службу поддержки клиентов. Пожалуйста, взгляните».
● [Я] удивился: «Не должно быть. Этот код находится в сети уже больше года, проблем не возникало, и в последнее время он не менялся».
Всем привет. Делюсь достоверной и интересной историей. Несколько дней назад внезапно произошел сбой проекта, стабильно работавшего в сети более года. Проверив, я обнаружил, что отправителем этого кода был я сам, но после тщательного рассмотрения проблему не обнаружил.
Обнаружить проблемы
После упрощения и удаления кода оставить такой кусок кода может быть проблематично.
getValuesById
заключается в получении массива на основе id
. Здесь в силу специфики бизнеса необходимо объединить два массива. На самом деле существует множество способов объединения массивов. В то время я решил использовать push
.
На первый взгляд в этом коде нет проблем, да и метод написания обычный. Проблема сбоя страницы не должна возникать. Кроме того, я много раз выполнял локальную проверку, и все они могут нормально работать.
По какой причине могут возникать проблемы в коде проекта, стабильно работающего более года? Единственное изменение — это время. Что изменит время? Это потому, что проект работает уже давно, и объем данных здесь стал больше, что привело к взрыву стека?
Поэтому я быстро смоделировал работу этого кода, когда было много вопросов по данным:
Стек фактически взорвался, а затем страница разбилась!
Почему этот код лопается? Это из-за push
или оператора расширения? Чтобы выяснить основную причину, я выполнил преобразование Babel для этого кода ES6. Результат:
Вы можете видеть, что этот код, наконец, становится push apply(values, newValues)
.
Изучив соответствующие материалы, я узнал, что если вызвать apply
вышеописанным способом, то это может превысить длину параметров движка JavaScript и что переданные здесь избыточные параметры будут вести себя по-разному в разных движках JavaScript. Из-за этого ограничения некоторые движки будут генерировать исключения и даже вызывать потерю параметров.
Боже мой, это так. Кто бы мог подумать, что небольшой оператор расширения и push
будут иметь такие побочные эффекты? Означает ли это, что использование операторов расширения во всех функциях также будет иметь такие побочные эффекты, когда передаваемые параметры превышают лимит? Я нашел ответ после тестирования.
Решать проблему
Существует множество способов объединения массивов. Мы можем изменить подходящий метод.
- Слияние с помощью
concat
.
2. Слияние с использованием оператора расширения (используется чаще).
3. Петля толчок.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord. Заинтересованы в Взлом роста? Ознакомьтесь с разделом Схема.