2015-02-10 49 views
0

我在一行中有幾個函數調用運行並等待返回,然後下一個運行。在這些運行之後,我有一個我想要運行的函數,但是在運行返回之前,我不想等待它完成。如何在流星法內運行任務而無需等待它完成?

這裏是我的意思的一個例子。

get_card,create_ordercreate_associationdebit_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 2015-02-10 18:13:42

+0

@Sindis你能給我一個提示嗎?我看過這篇文章,但我不明白我該如何使用它。大多數情況下它是在談論與我正在努力完成的事情相反的事情。 – JoshJoe 2015-02-10 20:49:49

+0

嘗試將需要彼此等待的所有操作封裝到一個光纖中 – Sindis 2015-02-10 21:54:53

回答

0

這件事似乎對我正在嘗試做的事情最好,只是使用Meteor.setTimeout({})。這看起來可能是一個奇怪的選擇,但它做我需要的一切,包括設置流星環境,以便我不必進行任何BindEnrironment調用。它也打破了當前的調用線程,這意味着它將結果返回給客戶端,稍後再完成其餘的調用(這是外部API,我不需要坐在那裏等待的用戶) 。

0

聽起來像你需要任務的並行和串行控制。 (如,每天下載400,000次)Node.js模塊的名稱爲async,其流星包裝爲peerlibrary:async

遲早你需要一個專門的後臺任務管理包。如果異步不足,請查看我對packages to control background tasks in Meteor的評估。

+0

我實際上可以通過使用這個解決我的問題。 (函數()){ Utils.create_user(customerData._id,data._id,debitOrder._id); },100); – JoshJoe 2015-02-11 15:12:52

+0

我真的需要了解更多關於這裏發生了什麼,但我認爲這是工作的原因是,任務是異步和流星照顧bindEnvironment,以便我仍然獲得所有傳遞給它的變量引用。那個聽起來是對的嗎? – JoshJoe 2015-02-11 15:14:32