簡體   English   中英

流星:如何使用Meteor.call從服務器返回數據

[英]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.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();

應該更快,因為您不會暫停當前的光纖來啟動下一個光纖

試試:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM