在另一个meteor电话里面的meteor电话
我有一个meteor调用结构如图所示:
Meteor.call('method1', function(err, result){ //do something Meteor.call('method2', function(err, result){ //do something }) ... })
'method2'有时不被调用。 我尝试了一个解决scheme,为“method2”添加了“setTimeout”,但是在2周后,方法2的剂量不再被随机调用。
任何人有任何线索? 感谢您的帮助。
有关我的代码的更多细节:
1)有两台服务器通过集群连接,命名为server1和server2
2)server1中定义的meteor方法命名为server1_method1和server1_method2
3)server2中定义的meteor方法命名为server2_method1和server2_method2
// server1的客户端
Meteor.call("server1_method1", function(err, result){ if(result){ Meteor.call("server1_method2", function(err,result){ //do something }) } })
// server1的服务器
var server2 = Cluster.discoverConnection('server2'); Meteor.methods({ 'server1_method1':function(){ server2.call('server2_method1', function(err, result){ //where problem happens if(result){ server2.call('server2_method2', function(err, result){ if(result){ //do something } }) } }) } })
// server2的服务器
Meteor.methods({ 'server2_method1':function(){ //do something like collect data from database }, 'server2_method2':function(){ //do something like collect data from database } })
server2调用'server2_method1'偶尔不会触发这些方法。
等待第一个调用的结果做第二个,如下所示:
Meteor.call('method1', function(err, result){ if (err) { console.log(err); } if (result){ Meteor.call('method2', function(err2, result2){ //do something }) } })
如果打算在第二个调用块中使用第一个调用variables,则还要考虑第二个调用参数的其他variables名称
在服务器1上,您的server1_method1
应该同步返回结果。 因此,从不调用集群调用的callback(它在范围之外)
Meteor.methods({ 'server1_method1': function(){ server2.call('server2_method1', function(err, result){ // this won't be called as the main server1_method1 needs to 'return' synchronously }); // this Client expects a returned value return 'ok'; } });
您需要将asynchronous函数转换为同步。 像这样的东西
var server2_method1 = Meteor.wrapAsync(function(callback) { server2.call('server2_method1', function(err, result){ callback(err, result); }); }); var server2_method1 = Meteor.wrapAsync(function(callback) { server2.call('server2_method2', function(err, result){ callback(err, result); }); });
然后你可以把它们称为同步函数
Meteor.methods({ 'server1_method1': function(){ var result1 = server2_method1(); if (result1 == 'something you need') { var result2 = server2_method2(); } return 'ok'; } });
要将params添加到同步函数,把它们放在这里就像这样
var server2_method1 = Meteor.wrapAsync(function(param1, param2, callback) { server2.call('server2_method1', param1, param2, function(err, result){ callback(err, result); }); });
您可以像这样调用。您可以在第二个方法调用中使用第一个方法调用的参数
Meteor.call('method1',var1,var2,function(err, result){ if (err) { console.log(err); } if (result){ Meteor.call('method2',var1,var2, function(err2, result2){ //do something }) } })