Вложенные асинхронные функции - возвращение в будущем внутри волокон

Мне нужно запустить две вложенные асинхронные функции и вернуть обратный вызов из второй клиенту. 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();

      }
    });
});

1 ответ

Решение

Будущее должно быть возвращено в области видимости первого метода. И читать о 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();
  }
});
Другие вопросы по тегам