此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.
}
});
}
});
答案 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