JavaScript Как предотвратить толкание NULL в Promise? - PullRequest
0 голосов
/ 24 октября 2018

Я работаю с Promises в Node (также использую Mongoose и Lodash) и мне нужно дождаться готовности списка операций над базой данных и отправить результаты в массив:

var users = [];

var email_to_id = function(email) {
  return new Promise(function(resolve, reject) {
    User.findOne({email: email}).exec().then(function(user, err) {
      if (user) {
        resolve(user);
      } else {
        reject(err);
      }
    });
  });
};

_.each(emails, function(email) {
  users.push(
    email_to_id(email).then(function(user, err) {
      if (user) {
        return user;
      } else {
        // How not to return anything?
      }
    }).catch(next)
  );
});

Пока все хорошо, однако, если я передаю неправильное электронное письмо и отклоняю email_to_id, функция _.each будет выдвигать null в массив users.

Как предотвратить его отправкуnull?И вместо этого ничего не толкай.

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете попробовать это.

const reflect = p => p.then(v => ({data: v, status: "fulfilled" }),
                            e => ({data: e, status: "rejected" }));
const emailPromises = emails.map((email)=>email_to_id(email)).map(reflect);

const filterdSuccessPromises = Promise.all(emailPromises)
                                        .then(results=>results
                                                            .filter(x => x.status === "resolved")
                                                            .map(data=>data.data)
                                        ));

На основании этого ответа .Он отображает все значения в объекты, которые говорят, удалось ли это или нет.Затем мы фильтруем значения, которые были успешными.И вы можете получить данные, используя filterdSuccessPromises.then

РЕДАКТИРОВАТЬ: Думая об этом, вы должны на самом деле фильтровать / чистить недействительные электронные письма, прежде чем делать какие-либо звонки дешевле, я не уверен, почему я не предложил это первым

var emails = emails.filter((email)=>email) //or any other validations.
...