1

我试图更好地了解发布/订阅模型的工作原理。

具体来说,我指的是教程中的一步。

if (Meteor.isServer) {
  Meteor.publish('tasks', function tasksPublication() {
    return Tasks.find();
  });
}

tasksPublication在本教程后面的任何地方都不会使用该名称。

在这里查看文档,似乎不需要名称。
命名发布函数有什么不同吗?

4

1 回答 1

6

发布时确实不需要使用命名函数,所有这些工作:

Meteor.publish('tasks', function publishAllTasks() { return Tasks.find() });
Meteor.publish('tasks', function() { return Tasks.find() });
Meteor.publish('tasks', () => Tasks.find());

(第三行具有箭头功能

功能上没有原始差异,在三者之间进行选择主要归结为口味。

但是,只有第一条语句(命名函数表达式)会做一件事:当发生未捕获的异常时,名称会出现在堆栈跟踪中。

例如,假设您在写作时打错了字,Tasks然后Waffles改为写作:

// File: server/index.js

Meteor.publish('tasks', function publishAllTasks() { return Waffles.find() });
// or:
Meteor.publish('tasks', () => Waffles.find());

这是第一种情况下的堆栈跟踪(我删除了时间戳)

来自子任务的异常 id egG3xJuLTLFvH4jLT ReferenceError: Waffles is not defined
at Subscription.publishAllTask ​​s [as _handler] (server/index.js:4:10)
(一些无聊的东西)

第二种情况下的堆栈跟踪:

来自子任务 id u4rKBFH78uTBEoys2 的异常 ReferenceError: Waffles is not defined
at Subscription._handler (server/index.js:4:10)
(更无聊的东西)

在第一种情况下,函数名称清楚地显示。
文件名和行仍然出现在行尾。

因此,如果您正在浏览日志以查找源自/通过的所有未捕获的异常,这可能publishAllTasks会有所帮助。
尽管在调试时它不会有太大帮助,因为您仍然拥有文件名和行并且找到错误的功能只是打开该文件的问题。


因此,除非您有特定的日志抓取需求,否则不要打扰并选择您喜欢的任何一个。

于 2016-04-16T15:16:34.667 回答