【问题标题】:Calling a function on the result of a promise in NodeJS在 NodeJS 中根据 promise 的结果调用函数
【发布时间】:2017-01-03 04:50:49
【问题描述】:
return User.findOne({email: email}).then((user) => {
    return user; });

那么是如何工作的?当我做return user

整个User.findOne({email: email}) ------> user吗?第一条语句是否转换为返回用户的函数,所以您正在这样做:

return user; 

最后?

当您执行 .then 并返回某些内容时,实际的 promise(第一个)语句会发生什么情况? (then之前的整个语句)?

【问题讨论】:

  • 您是否使用库来查询您的数据库?我不记得 .findOne 返回了一个承诺。
  • @DanielB,猫鼬

标签: javascript json node.js mongodb


【解决方案1】:

查看 Mongoose 的文档,您的代码中使用的 .findOne() 不会返回承诺,而是返回具有 .then() 函数的 query 函数,该函数从异步操作中产生值。要获得真正的承诺,您必须改用.exec(),可以阅读here

整个User.findOne({email: email}) ------> user?是否 左边的语句成为用户,那么你到底在做什么:return user;

没有。实际上,整个.then((user) => { return user; }); 部分是多余的。 .findOne(...)的值,只要返回like即可访问

return User.findOne({email: email});,然后访问查询的.then()。为了说明这一点,请查看fiddle,它演示了同样的事情,但具有真正的承诺。

当您执行.then 并返回某些内容时,实际会发生什么 承诺声明? (之前的全部陈述)?

什么都没有。如果你有 real 的 promise,它们要么是未决的、已完成的,要么是被拒绝的。 .then() 函数返回一个 new 承诺,该承诺也被拒绝或履行。当您从 .then() 函数内部返回某些内容时,返回的值实际上已解析,这意味着它有效地返回了 Promise.resolve(<value>).

【讨论】:

  • 所以当我在 User.findOne 上调用 .then 然后不返回 User.findOne({email: email}) 时,它会做什么?它会返回未定义吗?如果我有一个函数function exe () { User.findOne({email: email}).then((result) => {return result;})},我做exe(),返回什么?
  • 这将返回undefined,因为你没有在做{ return User.findOne(..) }。如果您查看我的小提琴,您会发现根本不需要添加.then(),而是应该将函数定义为function exe() { return User.findOne({ email: email}); }
  • function f () { return function g () { return "ggggg"; } } console.log(f()); 为什么会返回[Function: g]?而不是ggggg
  • 因为您要返回函数声明。首先在function f() 之外声明function g(),然后返回g()调用,例如function f() { return g(); }
  • 那么当你调用User.findOne({email: email}).then((result) => {return result;})时它会自动变成一个函数吗?所以现在当你返回它时,你返回 f 和f.then((result) => {return result}) 一样吗?其中f对应User.findOne...
【解决方案2】:

据我所知,.then 函数在 Mongoose 中在技术上已被弃用 - 您应该使用自己的 Promise 实现。

也就是说,看起来猫鼬一直在使用mpromise作为它的promise实现,并且.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 只是将一个新的承诺链接到前一个承诺的执行。实际上,您有两个 Promise,它们将一个接一个地执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2021-09-16
    • 2016-04-12
    • 2017-06-02
    • 2018-01-07
    • 2019-03-27
    • 2021-03-13
    • 2017-10-20
    相关资源
    最近更新 更多