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