当我在客户端上执行以下操作时:
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
)。如果我取消注释最后一行我收到的东西。所以问题是:当我运行异步代码时,我可以将某些内容返回给客户端吗?
答案 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.wrap和Future.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;
}
}