我有一个如下所示的流星调用结构:
Meteor.call('method1', function(err, result){
//do something
Meteor.call('method2', function(err, result){
//do something
})
...
})
有时候没有调用'method2'。我通过为'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'偶尔不会触发方法。
答案 0 :(得分:1)
等待第一个调用的结果成为第二个,如下所示:
Meteor.call('method1', function(err, result){
if (err) {
console.log(err);
}
if (result){
Meteor.call('method2', function(err2, result2){
//do something
})
}
})
如果计划在第二个调用块中使用第一个调用变量,还要考虑第二个调用参数的其他变量名
答案 1 :(得分:0)
在服务器1上,Equals
应同步返回结果。因此,永远不会调用Cluster调用的回调(它超出范围)
server1_method1
您需要将异步函数转换为同步。像这样的东西
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';
}
});
然后你可以把它们称为同步功能
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);
});
});
要将params添加到同步函数中,请将它们放在此处
Meteor.methods({
'server1_method1': function(){
var result1 = server2_method1();
if (result1 == 'something you need') {
var result2 = server2_method2();
}
return 'ok';
}
});
答案 2 :(得分:-1)
你可以像这样调用。你可以在第二个方法调用
中使用第一个方法调用的arrgumentsMeteor.call('method1',var1,var2,function(err, result){
if (err) {
console.log(err);
}
if (result){
Meteor.call('method2',var1,var2, function(err2, result2){
//do something
})
}
})