【发布时间】: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