![](/img/trans.png)
[英]How to get JSON data from server storage to client using Meteor.Call and update the return data synchronously in the template?
[英]Meteor: How to return data from the server using Meteor.call
當我在客戶端上執行以下操作時:
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
)。 如果我取消注釋最后一行,我會收到一些回復。 所以問題是:運行異步代碼時可以將某些東西還給客戶端嗎?
流星使用光纖允許異步代碼以順序方式編寫,以防止最終陷入回調地獄。 它們為光纖提供了抽象層。
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();
應該更快,因為您不會暫停當前的光纖來啟動下一個光纖
試試:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.