Meteor服务器异步方法调用并使用返回结果

时间:2015-07-17 05:50:01

标签: javascript meteor

我有一个方法在服务器端进行了非常繁重的计算,我需要调用此方法两次并使用这些调用的结果进行另一次计算:

combinationCalc: function(val1, val2) {
  var result1 = heavyCompute(val1);
  var result2 = heavyCompute(val2);

  return anotherComputation(result1, result2);
}

result2的值不依赖于result1的值,我如何异步执行这两个计算?

3 个答案:

答案 0 :(得分:1)

我想通过一些研究分享我自己的解决方案。这需要使用NPM封装光纤/未来

Future = Meteor.npmRequire('fibers/future');

combinationCalc: function(val1, val2) {
  var fut1 = new Future();
  var fut2 = new Future();

  heavyCompute(val1, fut1);
  heavyCompute(val2, fut2);

  var result1 = fut1.wait();
  var result2 = fut2.wait();

  return anotherComputation(result1, result2);
}


heavyCompute(val, fut) {
  // ALL THE COMPUTES!
  fut.return(compute_result);
}

我希望在服务器上有一个单独的入口点,并且尽可能少地混淆代码。

答案 1 :(得分:0)

您可以使用从客户端调用的Meteor methods并以异步方式运行。

首先在服务器上声明方法:

Meteor.methods({
  firstMethod: function (arg) {
    this.unblock();
    //do stuff
  },
  secondMethod: function (arg) {
    this.unblock();
    //do stuff
  }
});

请注意this.unblock();的使用,它允许从客户端进行方法调用而无需等待上一次调用(by default only one method can run at a time)。

然后,从客户端调用该方法(您也可以从服务器调用它们):

Meteor.call('firstMethod', arg, function(error, result() {
  //do something with the result
});
Meteor.call('secondMethod', arg, function(error, result() {
  //do something with the result
});

答案 2 :(得分:0)

使用Meteor方法和会话变量,您可以异步调用流星方法,将结果保存到会话变量中,并在两个参数准备就绪时执行第二次方法调用。

combinationCalc: function(val1, val2) {

  // Calls heavyCompute on val1
  Meteor.call('heavyCompute', val1, function(error, result) {
    Session.set('result1', result);
    // if heavyCompute on val2 finished first
    if(Session.get('result1') && Session.get('result2'))
      Meteor.call('anotherComputation', Session.get('result1'), Session.get('result2'), function(error, result) {
         Session.set('answer', result);
      });
  });

  // Calls heavyCompute on val2
  Meteor.call('heavyCompute', val2, function(error, result) {
    Session.set('result2', result);
    // if heavyCompute on val1 finished first
    if(Session.get('result1') && Session.get('result2'))
      Meteor.call('anotherComputation', Session.get('result1'), Session.get('result2'), function(error, result) {
         Session.set('answer', result);
      });
  });
}

然后,只需在想要使用结果的地方拨打Session.get('answer');

为了最大限度地减少冗余代码,您可以在anotherComputation方法本身内检查未定义。