【问题标题】:JavaScript How to prevent pushing null in a Promise?JavaScript 如何防止在 Promise 中推送 null?
【发布时间】:2019-03-28 11:10:09
【问题描述】:

我正在使用 Node 中的 Promises(也使用 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?而不是推动任何东西。

【问题讨论】:

  • .catch(next) 这看起来很重要,next 是做什么的?
  • 另外,我非常确定 .then 会忽略它的第二个参数 - err 不会一直是 undefined 吗? (这就是.catch 的用途)
  • .then(function(user, err) { 这不是一个承诺 - 你也在使用 Promise constructor anti-pattern,因为 User.findOne({email: email}).exec() 返回一个承诺,没有必要将它包装在一个新的承诺中
  • 不要在承诺中使用_.each!使用map,然后使用Promise.all

标签: javascript loops asynchronous promise each


【解决方案1】:

你可以试试这个。

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)
                                        ));

基于此answer。它将所有值映射到表示它是否成功的对象。然后我们过滤成功的值。并且可以通过filterdSuccessPromises.then获取数据

编辑:考虑到这一点,您实际上应该过滤/清理无效的电子邮件,然后再拨打更便宜的电话,我不知道为什么我不首先建议这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2018-02-19
    • 2012-08-28
    • 2011-01-11
    • 2019-04-08
    • 2012-10-14
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多