Meteor:如何使用Meteor.call从服务器返回数据

时间:2014-05-26 19:07:13

标签: javascript meteor

当我在客户端上执行以下操作时:

Meteor.call('fileUpload', fileInfo, fileData, function(err, response) {
    ....
});

在回调中我需要回复。所以在服务器上我有

Meteor.methods = {
   fileUpload: function (fileInfo, fileData) {

   fs.writeFile(path, fileData, "binary", function (err) {
       if (err) 
           return 'error';
       ...
       return { ..... };
  }
  //return 'this works';

}

不幸的是我在客户端没有收到任何东西。问题是服务器运行异步代码(fs.writeFile)。如果我取消注释最后一行我收到的东西。所以问题是:当我运行异步代码时,我可以将某些内容返回给客户端吗?

2 个答案:

答案 0 :(得分:4)

Meteor使用光纤来允许以顺序方式写入异步代码,以防止在回调地狱中结束。它们为光纤提供了未来的抽象层。

var Future = Npm.require('fibers/future');
var result  = Future.wrap(fs.writeFile)(path, fileData, "binary").wait();

这将异步writeFile方法包装在光纤中。

阅读以下文章,以更好地解释纤维的工作原理:
http://meteorhacks.com/fibers-eventloop-and-meteor.html

流星团队并不建议使用原纤维api。 Src:关于期货的https://www.npmjs.org/package/fibers部分

Async.wrapFuture.wrap基本上做同样的事情。 但是有一个很大的区别Async.wrap会隐藏未来并且不会让你使用.wait(),因为包装函数实际上并没有返回未来,而是返回未来返回的内容。

最后你可以使用我个人喜欢future.wrap,因为我想知道我正在使用光纤和放大器。期货,我不喜欢被我隐藏。

var wrappedSomeMethod = Async.wrap(someMethod);
wrappedSomeMethod();

不如:

var wrappedSomeMethod = Future.wrap(someMethod);
wrappedSomeMethod().wait();

未来的高级使用

它还允许您在不同的期货示例中运行多个事项:

var fooFuture = bar();
var wuFuture = bar();

var fooResult = fooFuture.wait();
var wuResult = wuFuture.wait();

应该更快,因为您没有暂停当前光纤以启动下一个

答案 1 :(得分:1)

试一试:

var writeFile = function(fileinfo, fileData, callback) {
   fs.writeFile(path, fileData, "binary", function (err) {
   if (err) 
       callback('error');
    ....
   callback(null, 'good')
   }
}


Meteor.methods = {
   fileUpload: function (fileInfo, fileData) {
      var result = Async.wrap(writeFile)(fileInfo, fileData);
      return result;
   }
}