2015-04-06 2 views
1

Новое для Метеор, и я его до сих пор люблю. Я использую vzaar.com как платформу видео хостинга, и у них есть пакет node.js/API, который я добавил к моему проекту Meteor с метеорными атаками: npm. Все в API отлично работает, но когда я загружаю видео, мне нужно получить идентификатор видео из API при успешной загрузке.Метеор: Сделать Meteor.method вернуть обратный вызов

Проблема:

Мне нужно, чтобы сохранить идентификатор видео вернулся из vzaar API после загрузки, но так как это происходит в будущем, мой код не ждать результата и просто дает мне «не определено». Возможно ли, чтобы Meteor.method подождал ответа?

Вот мой метод до сих пор:

Meteor.methods({ 

    vzaar: function (videopath) { 

     api.uploadAndProcessVideo(videopath, function (statusCode, data) { 
      console.log("Video ID: " + data.id); 
      return data.id; 

     }, { 
      title: "my video", 
      profile: 3 
     }); 

     console.log(videoid); 

    } 

}); 

И это, как Meteor.call выглядит как прямо сейчас:

Meteor.call("vzaar", "/Uploads/" + fileInfo.name, function (err, message) { 
    console.log(message); 
}); 

Когда я называю этот метод, я сразу же получить undefined в консоли браузера и метеоритной консоли, и через несколько секунд я получаю идентификатор видео в консоли метеорита.

+0

Вы можете написать новую функцию там, которая будет повторно запускаться, если 'videoid' не определено и передать его как обратный вызов (только помогает с обратным вызовом, если вы разбираете данные несколькими способами). Вы также можете вызвать ту же функцию, что и внутри. Вы также можете попробовать опрос, где вы установите интервал для проверки каждые n миллисекунд, затем очистите интервал, когда установлен параметр «videoid». – below9k

+0

Я нашел что-то интересное, Meteor.wrapAsync. Статья об этом здесь, но я не знаю, как ее реализовать в моем коде. https://meteorhacks.com/fibers-eventloop-and-meteor.html – user1554299

ответ

2

Решение

я, наконец, решить эту проблему, после нескольких дней проб и ошибок. Я узнал о Fibers (here и here) и узнал больше о цикле основных событий Node.js. Проблема заключалась в том, что этот вызов ответил в будущем, поэтому мой код всегда возвращал undefined, потому что он работал до, на который ответил api.

Я сначала попробовал Meteor.wrapAsync, который, как я думал, собирался работать, поскольку это на самом деле волокно будущего. Но в итоге я использовал вместо этого модуль NPM с исходным кодом. Смотрите этот рабочий код:

var Future = Npm.require('fibers/future'); 
Meteor.methods({ 

    vzaar: function (videopath) { 

     var fut = new Future(); 
     api.uploadAndProcessVideo(videopath, function (statusCode, data) { 

      // Return video id 
      fut.return (data.id); 
     }, { 
      // Video options 
      title: "hello world", 
      profile: 3 
     }); 

     // The delayed return 
     return fut.wait(); 

    } 

}); 

Не забудьте правильно установить модуль НПМ с meteorhacks:npm первым.

я узнал о том, как использовать волокно будущего в этом случае с помощью this stackoverflow answer.

Я надеюсь, что это может быть полезным для других, как это было на самом деле легко реализовать.

Смежные вопросы