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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете проверить, не определены ли свойства, сравнив его с undefined. Например, если вы хотите проверить свойство id, вы можете использовать
if (data.id === undefined){
throw new Error();
}
Однако мы не должны выдавать ошибки, если используем обещания.
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
Возвращаю просто напрасно else. Итак, измените свое состояние как data.id !== undefined
Больше вам не нужно, последний вызов функции - reject
Насколько я понимаю обещания, вы не отправляете сообщения о возврате resolve или reject. Просто позвоните им. Почему вы их возвращаете?
Я знал это, но это просто моя привычка, я всегда возвращаю их в своем коде обещания ... ^^
@TruongDang Похоже, это действительно меняет принцип работы кода. Согласно эта почта, возврат останавливает функцию. Без него функция может продолжаться. Интересно...
@Tyler Ага, просто убедитесь, что он полностью сломан прямо здесь ... Я встречал ошибку с nodejs в прошлом. Мой внутренний код все еще работает после ответа. Так как я продолжаю возвращать привычку, чтобы убедиться, что она сломается ...
хочет проверить отдельные свойства
@ user88432 Вы использовали Lodash? проверьте, как это if (!_.isEmpty(data)), чтобы убедиться, что ваши данные object не пустые
Один из способов сделать это - воспользоваться оценкой короткого замыкания и сделать что-то вроде:
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-условия, чтобы определить, следует ли вызывать отклонение.
@ J.Pichardo А как насчет создания новой функции, которая выполняет неопределенную логику проверки?
@ user88432 Это то, о чем я думал. У меня есть один, позвольте мне проверить.
@ user88432 это не так, я удалил это.
С тех пор, когда stackoverflow разрешил фрагменты кода ... это круто
Сначала вам нужно правильно запустить свой 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())
}
Таким образом, вы каждый раз получаете правильную ошибку, но мне не нравится обращаться к атрибутам с использованием строковых имен.
Вы никогда не выполняете свое обещание