Asynchronous Meteor第三方异步-“;Meteor代码必须始终在光纤内运行。”;

Asynchronous Meteor第三方异步-“;Meteor代码必须始终在光纤内运行。”;,asynchronous,meteor,promise,Asynchronous,Meteor,Promise,我使用stockfish npm软件包进行以下操作: 它是以一种非常不灵活的方式编写的,我似乎不得不这样使用它: Evaluator = (function() { var Promise = Meteor.npmRequire('promise'); var ev = Meteor.npmRequire('stockfish')(); var promise = new Promise(function (resolve, reject) { var line; e

我使用stockfish npm软件包进行以下操作:

它是以一种非常不灵活的方式编写的,我似乎不得不这样使用它:

Evaluator = (function() {
  var Promise = Meteor.npmRequire('promise');
  var ev = Meteor.npmRequire('stockfish')();
  var promise = new Promise(function (resolve, reject) {
    var line;
    ev.onmessage = function(e) {
      if (e && typeof e === "object") {
          line = e.data;
      } else {
          line = e;
      }
      if (line.indexOf('Total Evaluation') > -1) {
        var score = parseFloat(line.split('Total Evaluation: ')[1].split('(')[0])
        resolve(score);
      }
    };
  });


  return function(movesStr) { 
    ev.postMessage('position startpos moves ' + movesStr);
    ev.postMessage("eval");
    return promise;
  }

})();
并称之为:

Meteor.methods({
  evaluate: evaluate
});

function evaluate(movesStr) {
  return Evaluator(movesStr);
}
因此,从我的模型来看,调用如下所示:

Meteor.call('evaluate', movesStr)
    .then(function(gameScore) {
      log('gameScore', gameScore);
      Games.update(
        { _id: gameId },
        { $set: { score: gameScore } },
        function(err, docs) {
          log('cacheGameScore', 'err', err)
        }
      );
    });
这个代码“有效”,我可以在控制台上准确地看到结果

然而,数据库调用

Games.update
触发此错误:

[Error: Meteor code must always run within a Fiber. 
Try wrapping callbacks that you pass to non-Meteor 
libraries with Meteor.bindEnvironment.]
我曾尝试在许多地方添加Meteor.wrapAsync和Meteor.bindEnvironment,我总是收到这个错误消息


有什么想法可以在这里尝试吗?

什么是call()。然后()语法?这是新的吗?这是一个标准的JS承诺,在NPM中实现。它在不使用承诺的情况下工作吗?这个语法在其他例子中是否适用?不使用承诺意味着什么?Meteor.call('evaluate',function(err,res){Games.update()});是常规的Meteor语法