流星呼叫在另一个流星呼叫内

时间:2016-01-06 05:41:28

标签: node.js meteor

我有一个如下所示的流星调用结构:

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'偶尔不会触发方法。

3 个答案:

答案 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)

你可以像这样调用。你可以在第二个方法调用

中使用第一个方法调用的arrguments
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
   })
}
})