Выкидывать ошибку если undefined?

Есть ли способ выдать ошибку, если свойство не может быть найдено в data.

Проблема в том, что он отображает undefined, а не выдает ошибку.

const insertIntoTable = function(data) {
    return new Promise((resolve, reject) => {
        const entry = {
            Id: data.id,
            Method: data.Method,
            Status: data.PaymentStatus,
            InsertedAt: (new Date().getTime())
        }
    }).catch((error) => {
       console.info(error); 
    });
}

Вы никогда не выполняете свое обещание

J. Pichardo 05.06.2018 17:00

Вы должны проверить каждое свойство вручную, например. if (data.id === undefined) throw new Error("mapping undefined") Также вызовите resolve / reject, чтобы разрешить обещание.

sztrzask 05.06.2018 17:01
Поведение ключевого слова "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
2
4 406
4

Ответы 4

Вы можете проверить, не определены ли свойства, сравнив его с undefined. Например, если вы хотите проверить свойство id, вы можете использовать

 if (data.id === undefined){
     throw new Error();
}

Однако мы не должны выдавать ошибки, если используем обещания.

Tyler 05.06.2018 17:03
const insertIntoTable = function(data) {
return new Promise((resolve, reject) => {
    if (data.id){
      const entry = {
        Id: data.id,
        Method: data.Method,
        Status: data.PaymentStatus,
        InsertedAt: (new Date().getTime())
      }
      return resolve(entry);
    }
    return reject();

    })
    .then((data) => {
        // treat your entry data
    }) 
    .catch(() => {
       throw new Error("data is undefined")
    });
}

Нет необходимости возвращать resolve или reject, кроме того, OP хочет проверить отдельные свойства, а не только data

J. Pichardo 05.06.2018 17:07

Возвращаю просто напрасно else. Итак, измените свое состояние как data.id !== undefined

Truong Dang 05.06.2018 17:09

Больше вам не нужно, последний вызов функции - reject

J. Pichardo 05.06.2018 17:10

Насколько я понимаю обещания, вы не отправляете сообщения о возврате resolve или reject. Просто позвоните им. Почему вы их возвращаете?

Tyler 05.06.2018 17:10

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

Truong Dang 05.06.2018 17:11

@TruongDang Похоже, это действительно меняет принцип работы кода. Согласно эта почта, возврат останавливает функцию. Без него функция может продолжаться. Интересно...

Tyler 05.06.2018 17:15

@Tyler Ага, просто убедитесь, что он полностью сломан прямо здесь ... Я встречал ошибку с nodejs в прошлом. Мой внутренний код все еще работает после ответа. Так как я продолжаю возвращать привычку, чтобы убедиться, что она сломается ...

Truong Dang 05.06.2018 17:21

хочет проверить отдельные свойства

user88432 05.06.2018 17:41

@ user88432 Вы использовали Lodash? проверьте, как это if (!_.isEmpty(data)), чтобы убедиться, что ваши данные object не пустые

Truong Dang 05.06.2018 17:46

Один из способов сделать это - воспользоваться оценкой короткого замыкания и сделать что-то вроде:

const insertIntoTable = function(data) {
  return new Promise((resolve, reject) => {
      const entry = {
        Id: data.id || reject("data.id is undefined"),
        Method: data.Method  || reject("data.Method is undefined"),
        Status: data.PaymentStatus  || reject("data.PaymentStatus is undefined"),
        InsertedAt: (new Date().getTime())
      }
      resolve(entry);
  }).catch((error) => {
    console.info(error);
  });
}

insertIntoTable({}).then(data => console.info(data));

Однако мне трудно это читать, поэтому в настоящее время я ищу лучшую альтернативу.

ОБНОВИТЬ

Я работал над функцией с использованием прокси, которая обеспечивает поведение необязательный или по умолчанию, функция

function optional(obj, evalFunc, def) {

  // Our proxy handler
  const handler = {
    // Intercept all property access
    get: function(target, prop, receiver) {
      const res = Reflect.get(...arguments);

      // If our response is an object then wrap it in a proxy else just return
      return typeof res === "object" ? proxify(res) : res != null ? res : def;
    }
  };

  const proxify = target => {
    return new Proxy(target, handler);
  };

  // Call function with our proxified object
  return evalFunc(proxify(obj, handler));
}

И может применяться здесь как

const insertIntoTable = function(data) {
  return new Promise((resolve, reject) => {
      const entry = {
        Id: optional(data, t => t.Id, reject('Id is not present')),
        Method: optional(data, t => t.Method, reject('Method is not present')),
        Status: optional(data, t => t.PaymentStatus, reject('PaymentStatus is not present')),
        InsertedAt: (new Date().getTime())
      }
      resolve(entry);
  }).catch((error) => {
    console.info(error);
  });
}

insertIntoTable({}).then(data => console.info(data));

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

Не используйте try-catch. Просто используйте reject и .catch Promise, как будто это сообщение, которое будет использоваться. Используйте if-условия, чтобы определить, следует ли вызывать отклонение.

Tyler 05.06.2018 17:10

@ J.Pichardo А как насчет создания новой функции, которая выполняет неопределенную логику проверки?

user88432 05.06.2018 17:14

@ user88432 Это то, о чем я думал. У меня есть один, позвольте мне проверить.

J. Pichardo 05.06.2018 17:15

@ user88432 это не так, я удалил это.

J. Pichardo 05.06.2018 17:46

С тех пор, когда stackoverflow разрешил фрагменты кода ... это круто

Sidd Singal 12.01.2019 04:28

Сначала вам нужно правильно запустить свой Promise, так как вы его не решаете, мне нравится делать это так:

const insertIntoTable = function(data) {
    return Promise.resolve()
    .then(() => {
        const entry = {
            Id: data.id,
            Method: data.Method,
            Status: data.PaymentStatus,
            InsertedAt: (new Date().getTime())
        }
        // Do something with entry
    })
    .catch((error) => {
       console.info(error); 
    });
}

Таким образом, вы можете бросить внутрь себя проверку (вместо того, чтобы отвергать)

Вы можете создать функцию проверки, которая проверяет наличие undefined, например:

const validate = property => {
    if (property === undefined) throw 'data missing required property'
    return property
}

И используйте это так:

const entry = {
    Id: validate(data.id),
    Method: validate(data.Method),
    Status: validate(data.PaymentStatus),
    InsertedAt: (new Date().getTime())
}

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

const getAndValidate = (data, propertyName) => {
    const property = data[propertyName]
    if (property === undefined) throw 'data missing the required property' + propertyName
    return property 
}

И используйте это так:

const entry = {
    Id: getAndValidate(data, 'id'),
    Method: getAndValidate(data, 'Method'),
    Status: getAndValidate(data, 'PaymentStatus'),
    InsertedAt: (new Date().getTime())
}

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

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