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

Javascript Meteor:如何使用Meteor.call从服务器返回数据,javascript,meteor,Javascript,Meteor,在客户端上执行以下操作时: Meteor.call('fileUpload', fileInfo, fileData, function(err, response) { .... }); 在回调中,我需要响应。所以在我的服务器上 Meteor.methods = { fileUpload: function (fileInfo, fileData) { fs.writeFile(path, fileData, "binary", function (err) {

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

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
)。如果我取消最后一行的注释,我会收到返回的内容。所以问题是:当我运行异步代码时,我能返回一些东西给客户端吗

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

var Future = Npm.require('fibers/future');
var result  = Future.wrap(fs.writeFile)(path, fileData, "binary").wait();
这将异步writeFile方法包装在光纤中

阅读以下文章,更好地解释纤维的工作原理:

meteor团队不建议使用原始纤维api。Src:关于期货的章节

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

最后,你可以使用这两种方法,我个人更喜欢future.wrap,因为我想知道我正在从事fibers&futures的工作,我不喜欢对我隐瞒这一点

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();

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

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

var Future = Npm.require('fibers/future');
var result  = Future.wrap(fs.writeFile)(path, fileData, "binary").wait();
这将异步writeFile方法包装在光纤中

阅读以下文章,更好地解释纤维的工作原理:

meteor团队不建议使用原始纤维api。Src:关于期货的章节

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

最后,你可以使用这两种方法,我个人更喜欢future.wrap,因为我想知道我正在从事fibers&futures的工作,我不喜欢对我隐瞒这一点

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();
应该更快,因为您没有暂停当前光纤以启动下一个

请尝试:

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;
   }
}
试一试:

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;
   }
}

未来
未定义。我尝试了
Async.wrap
,其中一个是
Future.wrap
,与
Async.wrap
?JeanlucaScaljeri我更新了我的答案,解释了Future.wrap和Async之间的区别。wrap
Future
没有定义。我尝试了
Async.wrap
,其中一个是
Future.wrap
Async.wrap
?@JeanlucaScaljeri我更新了我的答案,解释了Future.wrap和Async.wrap之间的区别