return User.findOne({email: email}).then((user) => {
return user; });
然后如何运作?当我做return user
整个 User.findOne({email: email}) ------> user
?第一个语句是否转换为返回用户的函数,因此您正在执行:
return user;
最后?
当您执行 .then 并返回某些内容时,实际的promise(first)语句会发生什么? (然后之前的整个陈述?)
答案 0 :(得分:1)
查看Mongoose的文档,代码中使用的.findOne()
不返回promise,而是query
具有.then()
函数,该函数从异步操作中生成值。要获得真正的承诺,您必须改为使用.exec()
,因为可以阅读here。
整个
User.findOne({email: email}) ------> user
?是吗? 左边的语句成为用户,所以你到底在做什么:return user;
?
没有。实际上,整个.then((user) => { return user; });
部分是多余的。只需返回
.findOne(...)
的值
return User.findOne({email: email});
然后稍后访问查询的.then()
。为了说明这一点,请看一下这个fiddle,它展示了同样的东西,但有了真正的承诺。
当你执行
.then
并返回某些内容时,实际会发生什么 承诺声明? (之前的整个陈述)?
无。如果您有真实的承诺,则他们要么待决,要么被履行或被拒绝。 .then()
函数返回新承诺,该承诺也会被拒绝或履行。当您从.then()
函数内部返回某些内容时,实际上会解析返回的值,这意味着它会有效地返回Promise.resolve(<value>).
答案 1 :(得分:0)
据我所知,.then
函数在Mongoose中已被技术弃用 - 您的意图是使用自己的promises实现。
也就是说,看起来像mongoose一直在使用mpromise作为其承诺实现,而.then
函数已经实现here:
Promise.prototype.then = function (onFulfill, onReject) {
var newPromise = new Promise;
if ('function' == typeof onFulfill) {
this.onFulfill(handler(newPromise, onFulfill));
} else {
this.onFulfill(newPromise.fulfill.bind(newPromise));
}
if ('function' == typeof onReject) {
this.onReject(handler(newPromise, onReject));
} else {
this.onReject(newPromise.reject.bind(newPromise));
}
return newPromise;
};
.then
只是为执行先前的承诺链接了一个新的承诺。实际上你有两个承诺,它们将一个接一个地执行。