简体   繁体   English

UnhandledPromiseRejection 未定义问题

[英]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 sotry..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 个属性( namephoneemail ...),那么您可以通过以下方式进一步简化解析:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM