【问题标题】:what is fully-fledged promise什么是成熟的承诺
【发布时间】:2019-04-27 11:02:13
【问题描述】:

我正在浏览 mongoose 文档时,我无意中发现了

Mongoose 查询不是承诺。他们有一个用于 co 的 .then() 函数 和 async/await 作为一种方便。如果你需要一个成熟的承诺, 使用 .exec() 函数。

用这个例子

var query = Band.findOne({name: "Guns N' Roses"});
assert.ok(!(query instanceof Promise));

// A query is not a fully-fledged promise, but it does have a `.then()`.
query.then(function (doc) {
  // use doc
});

// `.exec()` gives you a fully-fledged promise
var promise = query.exec();
assert.ok(promise instanceof Promise);

promise.then(function (doc) {
  // use doc
});

现在,当他们说 完全成熟的承诺 时,我不明白他们的意思,比如对我来说 .then() 应该是一个承诺,然后它还允许异步和等待。

那么有人可以解释一下完全成熟的承诺是什么意思吗?

参考链接:https://mongoosejs.com/docs/promises.html#queries-are-not-promises

【问题讨论】:

  • "like for me .then() 应该是一个承诺" - 但是如果有一个 then 但它不是一个承诺呢?我们称之为a thenable

标签: javascript node.js mongoose


【解决方案1】:

@T.J.克劳德的回答确实帮助我澄清了很多事情(我遇到了这篇文章,因为我也很困惑),我只是想在这里补充一点:)

传统上,then() 方法返回一个 Promise。它最多需要两个参数:Promise 的成功 (onFulfilled) 和失败 (onRejected) 情况的回调函数。然而,Thenables 并不是这样工作的。我们将无法像使用“完全成熟的承诺”那样传递两个回调函数。用一些代码来说明这一点:

UserModel.find().exec((err, users) => {
  if (err) return res.status(400).send(err);
  res.status(200).json({
    success: true,
    users,
  });
});

这很好用,因为我们为成功和失败情况传入的两个回调函数称为 err(失败情况),而成功/结果情况称为用户。 请注意,Mongoose 中的所有回调都使用以下模式:回调(错误,结果) - 这与 MDN 网络文档中指定的回调函数的顺序不同。现在,如果我们运行相同的代码,但将 exec() 替换为 then(),如下所示:

UserModel.find().then((err, users) => {
  if (err) return res.status(400).send(err);
  res.status(200).json({
    success: true,
    users,
  });
});

这会返回 400 错误请求状态。

这是因为 Mongoose 查询不是“完全成熟的承诺”,因此我们不能将 .then() 链接到查询后面,然后期望它像真正的承诺一样行事。

但是,根据我的尝试,您实际上仍然可以使用 .catch() 进行错误处理,如下所示:

// {_id:1} is included to make this fail
UserModel.find({ _id: 1 })
  .then((users) => {
    res.status(200).json({
      success: true,
      users,
    });
  })
  .catch((err) => {
    res.status(400).send(err);
  });

【讨论】:

    【解决方案2】:

    这意味着查询返回的值是 thenables 根据Promises/A+ spec 的定义,但不是实际的Promise 实例。这意味着它们可能不具备 Promise 的所有特性(例如,catchfinally 方法)。实际的 Promise 实例将是“成熟的”承诺。

    英文术语“fully-fledged”的意思是“完整”或“完全开发”。它来自鸟类学(或至少是与鸟类相关的术语):长有成年羽毛的小鸡(幼鸟)是“成熟的”;如果它的所有成年羽毛都完全覆盖了它的down 底毛,那么它就是完全成熟的。

    【讨论】:

    • 致一直在编辑上面第二段的匿名用户:请停止。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 2011-01-24
    • 1970-01-01
    • 2023-03-17
    • 2014-11-22
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多