发布/订阅和方法有什么区别?我们在哪里/何时使用方法并发布/订阅?

时间:2018-11-23 08:17:42

标签: meteor

今天我尝试处理流星并遇到问题,无法从服务器页面获取数据。

我尝试在Google和流星上搜索它,但是有两种获取数据publish / subscribeMethod的方法

有下面的代码,我不知道如何在流星服务器端写它,并在客户端获取数据

function (x)
{
var y =2
var z  = y*x
return z;
}

现在我想在客户端调用此方法

3 个答案:

答案 0 :(得分:0)

通过发布/订阅,您可以跟踪收集到的数据。 https://docs.meteor.com/api/pubsub.html

根据文档:

  

方法是Meteor客户端可以调用的远程函数   流星。

因此,要回答最后一个问题:要从客户端调用函数,必须使用“ Meteor.call('yourMethodName',optionalCallBacks);”

编辑:

确定,如注释中所建议,此处为示例,并带有您的功能。 在服务器端,让我们在名为“ methods.js”或诸如此类的文件中说:

import { Meteor } from 'meteor/meteor';

Meteor.methods({
  myMethod(x) {
    const y = 2;
    const z = y * x;
    return z;
  }
});

然后在客户端,您可以调用此方法,例如:

Meteor.call('myMethod', x, (error, result) => {
  // OPTIONAL CALLBACK RESULT
  console.log(error, result);
});

这里的参数分别是方法的名称,名为x的变量,回调。

答案 1 :(得分:0)

  

publish / subscribe和method有什么区别?在何处/何时使用方法并发布/订阅?

因此,如果您需要逻辑,则不需要pub / sub。 方法用于逻辑pub / sub进行数据处理。

重要提示: 如果需要在方法上使用流星集合中的数据,则需要考虑到此方法,如果方法是在服务器端执行的,则它可以访问所有数据(集合)。 如果该方法在客户端执行,则只能访问已发布的数据。

另一方面,根据您的示例,您不需要任何数据,因此我将其跳过。

我强烈建议您使用经过验证的方法:

https://github.com/meteor/validated-method

现在让我们来看例子

想象您有一个方法

export const calculate = new ValidatedMethod({
  name: 'logic.calculate', // methods are usually named like this
  validate: new SimpleSchema({ // use SimpleSchema to autovalidate parameters
    x: {
      type: Number
    }
  }).validator(),
  run({ x }) {
    const y = 2;
    return y*x;
  }
});

注意事项:  1.该文件应在服务器上的某处导入。  2.您需要使用验证

现在在客户端调用它

Meteor.call('logic.calculate', { x }, (error, result) => {
  if (error) {
    do something
  }
  console.log(result);
});

此外,您可以直接导入方法并按如下方式调用它:

import { calculate } from '../../api/logic/methods';// use real method path here   

calculate.call({ x }, (error, result) => {
     if (error) {
        do something
     }
     console.log(result);
});

请注意,对于经过验证的方法,参数是一个对象

答案 2 :(得分:0)

在流星中,我们可以创建一个流星方法,并可以通过Meteor.call('methodName', 'param')将数据传递到客户端。但是在异步操作的情况下,我们需要使用future。看下面的例子:

Future = Npm.require('fibers/future');

Meteor.methods({
  foo: function() {
    const future = new Future();
    someAsyncCall(foo, function bar(error, result) {
      if (error) future.throw(error);
      future.return(result);
    });
    // Execution is paused until callback arrives
    const ret = future.wait(); // Wait on future not Future
    return ret;
  }
});