【问题标题】:Why does Meteor use fibers rather than promises or async or something else?为什么 Meteor 使用 Fiber 而不是 Promise 或 async 或其他东西?
【发布时间】:2014-11-09 07:28:40
【问题描述】:

为什么 Meteor 使用 Fiber 而不是 Promise 或 async 或者可能留下异步调用? 纤维有什么好处?有人能解释一下这个架构决定吗?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    Straight from the horse's mouth,Meteor 首席开发人员 Geoff Schmidt:

    Meteor 专注于为用户提供最佳体验 应用程序开发人员。我们必须做出一些看似不受欢迎或冒险的决定才能到达那里,但这导致了一套工具 更简单,更强大,更有趣的使用。 . . .事实证明 出,这些决定几乎没有风险或不受欢迎 有些人可能会察觉。最好说他们走了 反对 node.js 社区中的传统智慧。只取 一个示例,每个请求线程或每个请求进程模型是 在较大的软件工程社区中非常常见,而 有时会使用节点的延续传递(“异步”)样式 用于聊天服务器和消息总线,但几乎从未用于 商业逻辑。我认为服务器端 JavaScript 的使用将会 在接下来的几年里以多个数量级增长,我们正在 将有大量新开发人员涌入。大部分新代码 这些开发人员编写的将是业务逻辑,他们会想要 用他们使用的直线控制流来编写它 几乎所有其他框架。

    并引用a great article about Fibers in Meteor:

    Meteor 使用其 API 抽象 Fibers,让您可以编写自己的应用程序 没有回调。最好的部分是你可以这样写你的代码 方式并完全忘记纤维。它正常工作。

    纤维是 Meteor 如此受欢迎的最佳原因之一。既然它 允许我们编写没有回调的 Node.js 应用程序,它吸引了 许多开发者因此而讨厌 Node.js。

    换句话说,开发人员无需输入“Fiber”一词即可创建 Meteor 应用程序。这一切都发生在后台。因此,大多数应用程序的大多数开发人员真的没有理由关心“为什么选择 Fibers”而不是 Promise 或其他东西,因为开发人员并没有直接“使用”任何这些技术。 Meteor 团队可以在底层重写 Meteor 核心以使用 Promises 而不是 Fibers,并且大多数应用程序应该像以前一样继续运行,而不会注意到更改。

    至于为什么在 Meteor 核心本身中,核心团队更喜欢 Fibers 而不是 Promises 等,从我所读到的(并且在上面的 Geoff Schmidt 引用中有所暗示),这主要是他们的个人偏好——即他们厌恶回调和过分意识到其异步性质的代码。他们希望自己获得与 Meteor 应用程序开发人员相同的无回调体验。

    【讨论】:

    • 您作为开发人员不需要了解 Fibers,这仅适用于非常简单的 Meteor 应用程序。只要你想做一些异步的事情,比如从 S3 获取文件或将文件写入磁盘,你就必须了解 Fibers。
    • 是和不是。许多“异步”操作,如 HTTP.post(并等待响应)可以以同步方式编码。请参阅docs.meteor.com/#http 并注意有关asyncCallback 在服务器端运行时如何可选的文本。
    • 当然,Meteor 为通常是异步的命令提供了一些包装器,这会很有帮助。很快这还不够,即使在您只想使用 HTTP.post 的情况下也是如此。假设你想做 10 个 POST 请求,然后对结果做一些事情。使用 HTTP.post 方法,您必须发出一个请求,等待它返回,然后执行下一个,依此类推。如果您了解 Fibers/Futures,您可以同时执行所有请求并等待所有请求返回,然后您的代码继续执行。我真的建议任何在 Meteor 开发的人学习纤维。
    • 当然,如果您希望代码以异步方式运行,则需要使用回调或 Fiber 或其他方式以异步方式编写代码。在我自己的应用程序中,我经常使用this.unblock() (docs.meteor.com/#method_unblock) 和HTTP.post asyncCallback;但到目前为止,我从未在我的代码中直接使用 Fibers。我认为执行异步的“流星”方式是使用回调,而不是直接调用 Fibers;但这可能在所有情况下都是不可能的(或不可取的)。我的观点是,你可以在 Meteor 中做很多事情——可能是你需要做的所有事情,而无需学习 Fibers。
    • 尽管这篇文章已经很老了:我在我们的代码库中发现了类似if (collection.find({ uniqueValue }).count() === 0) { collection.insert({ uniqueValue }); } 的东西,它突然崩溃了,因为已经有一个值具有这个uniqueValue,因为该函数被调用了两次。写这篇文章的开发者 1. 不知道 collection.upsert() 和 2. 不知道 .count() 实际上是异步的。
    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2012-08-22
    • 2012-08-27
    相关资源
    最近更新 更多