Как предотвратить ошибку «Невозможно деструктурировать...» в JS?

Как я могу предотвратить ошибку «Невозможно деструктурировать поле» неопределенного или нулевого значения в этом коде:

const [{ field }, { field2 }] = await Promise.all([asynchronous operations...])

Убедившись, что обещания разрешаются в объекты с этими свойствами? то есть у первого должно быть свойство field, а у второго field2. В вашем случае одно из обещаний разрешается с помощью undefined или null. Предотвратить это.

trincot 01.03.2019 23:03

@trincot в Promise.all я выполняю операции с БД, в одном случае промис возвращает объект с этим свойством, а в другом возвращает 'null'. Если бы обещание вернуло «неопределенное», я бы смог использовать значение по умолчанию, но я не могу использовать его с нулевым значением.

Vlad 01.03.2019 23:10

Итак, что вы хотите сделать с вашими переменными field (field2), когда соответствующий промис разрешается в undefined или в null?

trincot 01.03.2019 23:23

Вы можете сопоставить null с undefined с помощью Array#map EG. (await Promise.all([...])).map( x => x === null ? undefined : x ), а затем используйте значения по умолчанию.

Paul 02.03.2019 00:00

@Paulpro, это была бы ванильная версия JS моего ответа, которая ускользнула от меня. Вы должны опубликовать это как ответ. :)

Scott Rudiger 02.03.2019 00:07

Вы можете предоставить запасной вариант следующим образом: const [{ field }, { field2 }] = (await Promise.all([asynchronous operations...]) || [{}, {}])

user6019272 02.03.2019 00:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
150
1

Ответы 1

Вот одно из возможных решений с использованием сторонней библиотеки (async-af).

const input = [Promise.resolve(null), Promise.resolve({field2: 'b'})];

(async () => {
  const [{field}, {field2}] = await AsyncAF(input).map(
    result => result != null ? result : {field: null, field2: null}
  );
  console.info(field, field2);
})();
<script src = "https://unpkg.com/[email protected]/index.js"></script>

В качестве альтернативы, если вы хотел использовать значение по умолчанию:

const input = [Promise.resolve(null), Promise.resolve({field2: 'b'})];

(async () => {
  const [{field = 'defaultValue'}, {field2 = 'defaultValue'}] = await AsyncAF(input)
    .map(result => result != null ? result : {});
  console.info(field, field2);
})();
<script src = "https://unpkg.com/[email protected]/index.js"></script>

К сожалению, только что понял, что это не покрывает 2-й результат, равный нулю. Придется смотреть дольше. Редактировать: ОК, исправлено.

Scott Rudiger 01.03.2019 23:44

Другие вопросы по теме