2016-11-22 18 views
0

機能のためにSMSを送信しようとしています。しかし、問題は次のとおりです。ファンクションが完了するまでに約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にいます。問題を解決するためにAsyncや他のライブラリを活用するにはどうすればよいですか?

私は15秒待ってから2番目のオブジェクトにループします。これがどのように達成されているか分かりません。 (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

すばやく汚い解決策mあなたのためのIGHT作業:

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

それは15000ミリ秒(15秒)、それらの間の間隔を持つすべての反復のための機能を実行します。これは唯一の方法ですsendSMSFreeはコールバックを取るか約束を返さない限りです。

約束を返した場合(あなたの質問にその機能がどのように機能するか説明していない)、それらをすべて同時に実行したいが、それらのすべてが終了するまで待つ - 回答を見るMatíasFidemraizerによる。

これらを連続して実行する場合、つまり、直前のものを終了するとすぐに新しいものを実行する場合は、より複雑になります。あなたが前のものが次のものを開始する前に終了した後に15秒の遅延を加えたいならば、それはもっと複雑になります。

この関数がコールバックを受け取る場合は、async.seriesを使用できます。

約束を返すのか、コールバックをまったく受け取るのか分からないので、詳細に説明する必要はありません。これはすべての推測です。あなたが興味があるなら、約束とコールバックがどのように機能するかを説明し、他の答えを見ることができます:

:要するに

ループ内で呼び出す関数が約束を返したり、コールバックを取ることはできません。タイムアウトを追加するだけで遅延させることができます。

もしそれが約束を返せば、QかBluebirdを使ってフローを制御できます。

コールバックが必要な場合は、非同期を使用してフローを制御できます。