2016-01-17 21 views
1

我需要運行兩個嵌套的異步函數並將第二個回調從客戶端返回。 Future.return在Fibers內不起作用。如何在不使用集合的情況下將結果返回給客戶端?嵌套的異步函數 - 在光纖內運行的未來回報

Meteor.methods({ 
    'youtube':function(object) { 

    var youTube = new YouTube(); 

    youTube.search(object.song, 1, function(error, result) { 
     if (error) { 
     console.log(error); 
     } 
     else { 
     Fiber(function() { 

      var future = new Future(); 

      ytdl.getInfo(result.url, function(err, result) { 
      future.return({data: result}); 
      }); 

      return future.wait(); 

     }).run(); 

     } 
    }); 
}); 
+0

使用'Meteor.wrapAsync'和去除纖維,只使用未來 –

回答

2

將在第一個方法範圍內返回未來。和`ytdl.getInfo`瞭解Meteor.bindEnvironment

var Future = Npm.require('fibers/future'); 
var bound = Meteor.bindEnvironment(function(callback){ return callback(); }); 
Meteor.methods({ 
    'youtube':function(object) { 
    var fut = new Future(); 
    var youTube = new YouTube(); 

    youTube.search(object.song, 1, function (error, result) { 
     bound(function() { 
     if (error) { 
      console.log(error); 
     } else { 
      ytdl.getInfo(result.url, function(err, result) { 
      fut.return({data: result}); 
      }); 
     } 
     }); 
    }); 
    return fut.wait(); 
    } 
}); 
+0

謝謝您的回答,我不知道bindEnviroment。我想知道它將如何處理來自第一個異步函數的結果(youTube.search函數中的多個搜索結果)。 試圖用這個例子來實現它 - https://gist.github.com/joscha/4130605。但是不能把我的頭圍繞着它如何與bindEnviroment一起工作 – mhlavacka

+0

當你需要返回數據時,你只需執行'fut.return()'。例如,如果你正在遍歷某個數組,只需在數組結束後返回數據。 –

+0

關於'bindEnviroment' - 它是在'Fibers'內使用「魔術」C代碼(單獨討論巨大的話題)。所以,你只需要知道它 - 在所有非流星異步回調中使用,因爲所有流星的異步回調已經包裝到'bindEnviroment'中。 –