Meteor js 并行数据库获取。

3

假设我有以下代码,它从多个集合中获取数据。

//code running on server.
var a = collectionA.findOne({...});
var b = collectionB.findOne({...});
var c = collectionC.findOne({...});
var d = collectionD.findOne({...});

如果我没错的话,上面的代码将以串行方式运行。因此等待获取集合的时间会累加,响应时间会延迟。

有没有一种方法可以以并行方式运行上述代码,最好是使用Promise模式?

1个回答

0
Meteor不使用promise或async,它使用Fibers。您可以直接使用它或通过方法使用。
使用方法可能如下所示:
服务器端:
function fetchAFromDB(arg,cb){ //function needs a callbac
  var a = collectionA.findOne(arg);
  if (!a) {
    cb(new Meteor.Error("a-not-found", "Can't find a"));
  else
    cb(null,a) //first argmument is always an error
}

Meteor.methods({
 fetchA: function (arg) {       
   var fetchAAsync = Meteor.wrapAsync(fetchAFromDB); //wrap function as async
   var result = fetchAAscync(arg); //execute function
   return result; //return value
  }
}
//call method on the server
//async
Meteor.call('fetchA', {_id:'foo'}, function (error, result) { ... } );
//blocking 
var result = Meteor.call('fetchA', {_id:'foo'});

用以下代码在客户端调用:

Meteor.call('fetchA', {_id:'foo'}, function (error, result) { ... } );

另一种方法是直接使用纤程(纤程文档):
对于您的用例,它可能看起来像这样:
服务器端:
function doSomethingWith(a){...} //does something with a

var Fiber = Npm.require('fibers'); 
var async = Fiber(function() {  
    var a = collectionA.findOne({...});
    return doSomethingWith(a);
});

//calls you async function
async.run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接