在NodeJS中调用promise的结果函数

时间:2016-12-31 16:42:48

标签: javascript json node.js mongodb

return User.findOne({email: email}).then((user) => {
    return user; });

然后如何运作?当我做return user

整个 User.findOne({email: email}) ------> user?第一个语句是否转换为返回用户的函数,因此您正在执行:

return user; 

最后?

当您执行 .then 并返回某些内容时,实际的promise(first)语句会发生什么? (然后之前的整个陈述?)

2 个答案:

答案 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只是为执行先前的承诺链接了一个新的承诺。实际上你有两个承诺,它们将一个接一个地执行。