【发布时间】:2018-03-07 23:54:06
【问题描述】:
我对这个 Promise 链接的工作原理感到困惑,我对 Promise 和 js 还很陌生,所以请原谅
第三行,return user.findOne({email}).then((user) => {,我只是对返回这个承诺如何做任何事情感到困惑,因为它在 .then() 中返回另一个承诺
UserSchema.statics.findByCredentials = function(email, password){
user = this;
return user.findOne({email}).then((user) => {
if (!user){
return Promise.reject();
}
return new Promise((resolve, reject) => {
bcrypt.compare(password, user.password, (err, res) => {
if (res){
resolve(user);
}else{
reject()
}
});
});
});
}
在 express 应用中使用的 findByCredentials 模型方法
app.post("/users/login", (req, res) => {
var body = _.pick(req.body, ["email", "password"]);
User.findByCredentials(body.email, body.password).then((user) => {
res.send(body)
}).catch((e) => {
res.send("!");
})
我刚刚创建的一个更简单的例子,这部分
return plus(1).then((res) => {
return new Promise((resolve, reject) => { 是我无法理解的问题
function plus(a) {
return new Promise((resolve, reject) => {
resolve(a + 1);
});
}
function test() {
return plus(1).then((res) => {
console.log(res);
return new Promise((resolve, reject) => {
resolve("Test");
});
});
}
test().then((res) => {
console.log(res);
});
【问题讨论】:
-
从
then回调返回的承诺是the true power of promises -
@Bergi 不想打扰你,但你是专家;你会用另一种方式写这个,不同于我在回答中描述的方式吗?我也很想知道。
-
@NicholasKyriakides 你的意思是解释还是代码?关于代码,我不会使用
new Promise作为bcryptnatively supports returning promises :-) -
@Bergi Nice;我会将其添加为注释,但保持结构不变以说明如何处理 Promise 链中的回调样式代码。
-
@NicholasKyriakides 实际上,我真的很喜欢您答案的原始修订版,您将其分解为辅助函数。使承诺代码更易读 imo
标签: javascript promise return