使用ValidatedMethod

时间:2017-05-19 09:36:16

标签: javascript meteor methods

我正在使用Meteor。正如您在Github上的ValidatedMethod自述文件中看到的那样,它在调用方法时使用了returnStubValue选项,但它似乎对我不起作用。我想知道你对它的看法。

我上传了一个简单的Meteor项目,可以在Github上重现问题Link to the repository

这是我的服务器端方法:

export const createTodo = new ValidatedMethod({
  name: 'todos.create',
  validate: new SimpleSchema({
    todo: String,
  }).validator(),
  run({ todo }) {

    if (this.isSimulation) {
      return { finished: false };
    }

    Todos.insert({ todo });
    return { finished: true };
  },
});

这是一个在todos集合中插入待办事项的简单方法。在客户端,我立即返回一个对象{ finished: false }。在服务器端,我更新我的数据库,然后返回一个对象{ finished: true }

这是我的客户端方法调用:

createTodo.call({ todo }, (err, res) => {
  console.log(res);
});

我只是调用方法和console.log结果。 因为我使用的是使用returnStubValue选项的mdg:validated-method ,我想我的控制台应输出finished: false,然后输出finished: true。但它实际上只输出finished: true

我有什么不明白的地方吗?

1 个答案:

答案 0 :(得分:0)

mdg:validated-method表现不错。如果您在不引入Meteor.apply的情况下调用(实际validated-method)常规Meteor方法,则会观察到相同的结果。

这是事情。在流星的documentation

  

方法模拟的返回值被丢弃,除非   调用Method时传递returnStubValue选项,其中   如果返回到Method调用者。 ValidatedMethod传递此信息   默认选项。

注意粗体。在您的示例项目中,模拟中返回的对象{ finished: false }是调用的返回值,而不是回调。因此,以下转换如何进行客户端调用

const ret = createTodo.call({ todo }, (err, res) => {
  console.log('res', res);
});
console.log('ret', ret);

将打印

ret, {finished, false}
res, {finished, true}
控制台上的

。通过等待没有服务器结果使UI变得乐观。这种行为是完全有道理的,不是吗?

好问题!