Объясните, пожалуйста, зачем люди в js используют подобные конструкции и насколько это полезно/разумно?

Там, где return:

const orders = await apiQueueService.executeInQueue(this.api.futuresOpenOrders) || []
return orders && Array.isArray(orders) && orders.map((o) => ({ ...o, orderId: String(o.orderId) })) || []

Как по мне, проверка на то, что orders - это undefined или что orders - это не массив - лишние. Часто ли такое используют?


Ответы (1 шт):

Автор решения: Qwertiy

Тут половина кода - мусор.

const orders = await apiQueueService.executeInQueue(this.api.futuresOpenOrders) || []
//                                                                              ^^^^^

В orders после такого никак не может быть ложного значения.

И даже если эту замену выкинуть, то

return orders && Array.isArray(orders) && orders.map((o) => ({ ...o, orderId: String(o.orderId) })) || []
//     ^^^^^^    ^^^^^^^^^^^^^^^^^^^^^                                                              ^^^^^

Нет ни одного ложного значения, на котором Array.isArray вернёт true.

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

Этот код без изменения функциональности упрощается до:

const orders = await apiQueueService.executeInQueue(this.api.futuresOpenOrders)
return Array.isArray(orders) ? orders.map((o) => ({ ...o, orderId: String(o.orderId) })) : []

Но и это фигня потому что:

  1. Api должно возвращать ожидаемые данные, а не какой-то мусор. Какие основания полагать, что вместо массива может вернуться что-то другое, но если вернулся массив, то объекты в нём именно того типа, какой ожидается?

  2. Если предполагается, что не массив - это ошибка, то её надо нормально обрабатывать, а не заменять данные на пустой массив. Обычно пустой массив является валидным результатом, а значит дальше эти ситуации уже не различить. Лучше бы вообще ошибки различать между собой, но если нет, то даже null был бы полезнее.

  3. Преобразование id в строку тоже не радует.

→ Ссылка