方法回调中的Meteor DDP回调

时间:2016-11-03 08:50:31

标签: meteor

此Meteor服务器代码对外部服务serv2进行DDP调用,一旦获得结果,它就会发送回发起呼叫的客户端,但事实并非如此。

什么是最好的解决方案?我应该利用MongoDB的反应性吗?

/////////////////////////// client/main.js \\\\\\\\\\\\\\\\\\\\\\\\\\

Template.hello.events({
  'click button'(event, instance) {
    Meteor.call('service2', function (err, res) {
      if (!err) {
        console.log('got it');  //=> prints right away without waiting.
        console.log(res);       //=> print undefined <==================
        instance.msg.set(res);
      }
    });
  }
});

/////////////////////////// server/app.js \\\\\\\\\\\\\\\\\\\\\\\\\\

import { Meteor } from 'meteor/meteor';
import { DDP } from 'meteor/ddp-client';

let serv2 = DDP.connect('localhost:7001');

Meteor.methods({
  'service2': function () {
    serv2.call('service2', function (err, res) {
      if (!err) {
        console.log(res); //=> prints OK
        return 'service 1 calling service 2 <br> + res'; //<====== failed to return.
      }
    });
  }
});

1 个答案:

答案 0 :(得分:2)

这就是发生的事情:

  • 客户端调用服务器上的service2方法,并在调用回调之前等待DDP响应。

  • 服务器开始运行service2函数,serv2.call()启动 .call()到您的:7001服务器。

  • serv2.call()会立即返回,因为调用是异步的。

  • service2函数现已完成,并返回undefined,因为它没有任何return语句。

  • 您的客户端回调会获得此结果并按照您的描述运行。

  • 在稍后的某个时刻,对serv2的调用已经完成,并且它的回调已经运行,但由于没有人正在收听它的返回值,所以它在空白中丢失了......

要使设置正常工作,您需要service2()等待serv2.call()的结果。方法Meteor.wrapAsync()就是为此目的而存在的。请参阅http://docs.meteor.com/api/core.html#Meteor-wrapAsync

您也可以从此处的讨论中受益:Meteor: Proper use of Meteor.wrapAsync on server