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之间的区别。wrapFuture
没有定义。我尝试了Async.wrap
,其中一个是Future.wrap
与Async.wrap
?@JeanlucaScaljeri我更新了我的答案,解释了Future.wrap和Async.wrap之间的区别