Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor服务器异步方法调用并使用返回结果_Javascript_Meteor - Fatal编程技术网

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

Javascript Meteor服务器异步方法调用并使用返回结果,javascript,meteor,Javascript,Meteor,我有一个方法在服务器端执行非常繁重的计算,我需要调用此方法两次,然后使用这些调用的结果进行另一次计算: combinationCalc: function(val1, val2) { var result1 = heavyCompute(val1); var result2 = heavyCompute(val2); return anotherComputation(result1, result2); } result2的值不依赖于result1的值,如何异步执行这两个计算?

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

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

  return anotherComputation(result1, result2);
}
result2的值不依赖于result1的值,如何异步执行这两个计算?

您可以使用从客户端调用并异步运行的计算

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

Meteor.methods({
  firstMethod: function (arg) {
    this.unblock();
    //do stuff
  },
  secondMethod: function (arg) {
    this.unblock();
    //do stuff
  }
});
注意
this.unblock()的用法
允许在不等待上一次调用()的情况下运行来自客户端的方法调用

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


使用Meteor方法和会话变量,您可以异步调用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')无论您想在哪里使用结果


为了最大限度地减少冗余代码,您可以将未定义的检查放在
另一个计算
方法本身中。

我想分享我通过一些研究发现的自己的解决方案。这需要使用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);
}

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

我想知道Meteor中的最佳设计模式,以及是否有任何库可以保持我的代码整洁。是什么让heavyCompute函数不阻塞?是否有流星延迟或类似的东西?正如目前所写的,如果你只是把计算机扔到上面写着“所有的计算机”的地方,它似乎会阻止。也许:heavyCompute(val,fut){Meteor.defer(function(){//所有的计算!fut.return(compute_result);}}是的,你是对的,我认为最初的意图是找到一种方法,使heavyCompute(val1,fut1);重型计算机(val2、fut2);可以异步运行,而不管heavyCompute本身是否阻塞。
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);
}