[英]UnhandledPromiseRejection undefined problem
I hope you can help me.我希望你能帮助我。 I am developing a functionality that reads a series of data (data is taked from csv file) and checks if it has to put it in a list or not.我正在开发一个读取一系列数据的功能(数据取自 csv 文件)并检查它是否必须将其放入列表中。 The problem comes when I start to check the data (through promises) since it gives me an error telling me that the rejected promise has not been captured.当我开始检查数据(通过承诺)时,问题就出现了,因为它给了我一个错误,告诉我被拒绝的 promise 尚未被捕获。 You will need to use the following:您将需要使用以下内容:
// -npm install email-existence
const emailExistence = require("email-existence");
The code:编码:
function checkEmailExistencePromise(element) {
return new Promise((resolve, reject) => {
emailExistence.check(element.email, (error, response) => {
if (error) {
reject(error);
return;
}
// If the person has false email the promise will be save (as object) with "Exists" attribute in false.
if (!response) {
resolve({
name: element.name,
phone: element.phone,
email: element.email,
document: element.document,
weight: element.weight,
tags: element.tags,
exists: false,
});
return;
}
// If the person has valid email the promise will be save (as object) with "Exists" attribute in true.
resolve({
name: element.name,
phone: element.phone,
email: element.email,
document: element.document,
weight: element.weight,
tags: element.tags,
exists: true,
});
});
}).catch(() => {
throw console.error();
});
}
// I call the function that will write the CSV file with valid email records.
checkEmails();
// This function collects the promises of the "checkEmailExistencePromise" function and dumps them into an array.
async function checkEmails() {
const promises = sinRepetidos.map((element) =>
checkEmailExistencePromise(element)
);
const values = await Promise.all(promises);
// Here we go through the promises (which are also objects) and those with the true attribute I put them in a new array that will be printed later.
values.forEach((element) => {
if (element.exists === true) {
checked.push(element);
}
});
Because checkEmailExistencePromise()
can throw an error (both through the reject()
and the throw
call), you need to wrap your因为checkEmailExistencePromise()
可以抛出错误(通过reject()
和throw
调用),你需要包装你的
const values = await Promise.all(promises);
call in checkEmails()
in a try..catch
as well, like so在try..catch
中调用checkEmails()
,就像这样
let values = null;
try {
values = await Promise.all(promises)
} catch (e) {
console.error(e)
}
// do something with values, if it's not null
Edit编辑
As you most likely don't want checkEmailExistencePromise
to throw an error, you can replace it with this:由于您很可能不希望checkEmailExistencePromise
引发错误,因此可以将其替换为:
function checkEmailExistencePromise(element) {
// NOTE: we're making is so that this promise never rejects - if there's
// an error in there, we'll assume that the email isn't valid
return new Promise(resolve => {
emailExistence.check(element.email, (error, response) => {
let exists = false;
if (error) {
// we can log the error, to make sure we're not doing anything wrong
// that needs to be fixed - some errors can be legit, though
console.error(error);
}
// NOTE: we should probably actually check the response
if(response) {
exists = true;
}
resolve({
name: element.name,
phone: element.phone,
email: element.email,
document: element.document,
weight: element.weight,
tags: element.tags,
exists
})
});
})
}
We take any error to mean that the email isn't valid.我们认为任何错误都意味着 email 无效。
Also, if element
only contains those 6 properties ( name
, phone
, email
...), then you can simplify the resolve further with something like this:此外,如果element
仅包含这 6 个属性( name
、 phone
、 email
...),那么您可以通过以下方式进一步简化解析:
resolve(Object.assign({},element,{exists}))
This will make a shallow clone of the object and add the exists
property to it这将生成 object 的浅层克隆,并为其添加exists
属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.