2015-02-10 3 views
0

У меня есть несколько вызовов функций в строке, которые запускаются и ждут возврата, затем запускается следующий. После того, как они будут запущены, у меня есть одна функция, которую я хочу запустить, но потом я не хочу дождаться ее выполнения до того, как я заработаю свое возвращение.Как запустить задачу внутри метеорного метода, не дожидаясь завершения?

Вот пример того, что я имею в виду.

get_card, create_order, create_association и debit_order все должны ждать предыдущей функции, чтобы завершить, прежде чем они могут работать. Когда я доберусь до Queue.start_account_creation_task, я хочу, чтобы он запустился, но затем пусть сразу же вернется на строку ниже.

Meteor.methods({ 
    singleDonation: function (data) { 
     logger.info("Started singleDonation"); 

       //Get the card data from balanced and store it 
       var card = Utils.get_card(customerData._id, data.paymentInformation.href); 

       //Create a new order 
       var orders = Utils.create_order(data._id, customerData.href); 

       //Associate the card with the balanced customer 
       var associate = Utils.create_association(customerData._id, card.href, customerData.href); 

       //Debit the order 
       var debitOrder = Utils.debit_order(data.paymentInformation.total_amount, data._id, customerData._id, orders.href, card.href); 

      Queue.start_account_creation_task(customerData._id, data._id, debitOrder._id); 
      return {c: customerData._id, don: data._id, deb: debitOrder._id}; 
    } 
}); 
+0

https://meteorhacks.com/fibers-eventloop-and-meteor.html – Sindis

+0

@Sindis Можете ли вы дать мне подсказку здесь? Я просмотрел эту статью, и я не понимаю, как я могу это использовать. В основном речь идет о том, чтобы делать противоположное тому, что я пытаюсь выполнить. – JoshJoe

+0

Попробуйте обернуть все действия, которые должны ждать друг друга в одном волокне – Sindis

ответ

0

То, что казалось лучшим для того, что я пытался сделать, это просто использовать Meteor.setTimeout({}). Это может показаться странным выбором, но он делает все, что мне нужно, включая настройку среды Meteor, так что мне не нужно было делать вызов BindEnrironment. Он также вырывается из текущего потока вызовов, что означает, что он возвращает результат клиенту, а второй позже заканчивает остальные вызовы (которые относятся к внешним API-интерфейсам, которые мне не нужны, чтобы мои пользователи сидели там в ожидании) ,

0

Похоже, что для выполнения задач требуется параллельное и последовательное управление. (как, 400 000 загрузок в день) Модуль Node.js для этого называется async, а обертка для Meteor для него - peerlibrary:async.

Рано или поздно вам понадобится специальный пакет управления задачами. Если асинхронность недостаточна, посмотрите мою оценку packages to control background tasks in Meteor.

+0

Я действительно смог решить свою проблему, используя это. Meteor.setTimeout (функция() { Utils.create_user (customerData._id, data._id, debitOrder._id); }, 100); – JoshJoe

+0

Мне действительно нужно узнать больше о том, что здесь происходит, но я думаю, что причина этого в том, что задача - и асинхронная, и метеор заботится о bindEnvironment, так что я все равно получаю все мои ссылки на переменные, переданные ей. Звучит ли это правильно? – JoshJoe

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