2016-11-22 283 views
0

我正在嘗試發送函數的短信。但問題是:該功能需要大約10-15秒才能完成(因爲我們用PhantomJS完成了一堆東西)。異步等待函數

_.each(users, function(userData){ // This does not work since i need to wait for 15 seconds 
    smsFree.sendSMSFree(userData, productUrl); 
}); 

我甚至嘗試過使用setTimeout,但那並沒有很好的工作。

我上的NodeJS。我如何利用異步或其他庫來解決我的問題?

我要等待15秒鐘,然後循環到第二個對象。不知道這是如何實現的。 (Async.serial?)

  • [R
+0

如何判斷函數何時結束?它會返回一個承諾嗎?要求回撥? –

+0

@MadaraUchiha讓我們說我的其他功能確實給回電話。現在你能告訴我如何修改這個以等待我循環其他對象之前? – TechnoCorner

+0

理想情況下,您需要了解承諾..之後,您可以使用一些很好的功能,使用和聲開關隱藏在節點V7中。 'async'&'await'。 – Keith

回答

4

您應該使用promise patternwith Q。你的函數應返回一個承諾和事情就好辦了:

Q.all(users.map(user => smsFree.sendSMSFree(userData, productUrl))) 
     .then(() => { 
      // Do stuff once every SMS has been successfully sent! 
     }); 

或標準Promise

Promise.all(users.map(user => smsFree.sendSMSFree(userData, productUrl))) 
     .then(() => { 
      // Do stuff once every SMS has been successfully sent! 
     }); 

如果功能不使用承諾模式你可以把它包裝使用整個模式,否則你會被卡在實現異步延續的方面...

2

一個快速和骯髒的解決方案,米飛行爲你工作:

var n = 0; 
_.each(users, function (userData) { 
    setTimeout(function() { 
    smsFree.sendSMSFree(userData, productUrl); 
    }, 15000 * n++; 
}); 

它運行與15000毫秒(15秒),它們之間的間隔每次迭代的功能。這是你能做到這一點,除非sendSMSFree要麼需要一個回調或返回一個承諾的唯一途徑。

如果它返回一個承諾(它可能,你沒有解釋你的問題是如何工作的),並且你想同時運行它們,但要等到所有這些都完成了 - 看到答案通過MatíasFidemraizer。

如果您想要串聯運行它們,即在前一個完成後立即運行一個新的,那麼它會更加複雜。如果你想在開始下一個之前增加15秒的延遲時間,它將會更加複雜。

如果函數需要一個回調,那麼你可以使用async.series

有中詳細解釋它是沒有意義的,因爲我們甚至不知道它是否會返回一個承諾或採取回調在所有 - 這都是猜測。你可以看到,解釋如果你有興趣的承諾和回調是如何工作的其他答案:

總結:

如果你在循環中調用的函數都不是返回一個承諾也不需要回調 - 那麼你只能添加超時來延遲它們。

如果它返回一個承諾 - 您可以使用Q或藍鳥來控制流量。

如果需要回調 - 您可以使用異步來控制流量。