2016-10-01 4 views
-1

snoowrapライブラリは、関数を使用して関数を呼び出したときに約束を返します。私はノードが呼び出しが完了するまで待ってから、そのコールバック関数を実行したいと思います。どうやってやるの?私は、setTimeout、wait.forライブラリ、および他のソリューションを使用するさまざまな形を試しましたが、どれもうまくいきませんでした。無限ループ中にノードが約束を待つようにするには?

 while(1){ 
      for (var i = 0; i < allowableTimes.length; i++) { 
       if (new Date().getTime() == allowableTimes[i].getTime()) { 
        reddit.getHot('aww', {limit: 1}).then(sendToSlack); 
       } 
      } 
     } 

function sendToSlack(res){ 
    var url = res[0].url; 
    var title = res[0].title; 

    bot.sendWebhook({ 
     username: "bawwt", 
     icon_emoji: ":smile_cat:", 
     text: "<" + url + "|" + title + ">", 
     channel: "#random" 
    }); 
} 

解決しよう:私はあなたがノードを与えることはありませんので、あなたのコールバックが呼び出されることは決してありません理由があると信じて

if (!err) { 
      reddit.getHot('aww', {limit: 1}).then(handleReddit); 
    } 
}); 

function handleReddit(res) { 
    for (var i = 0; i < allowableTimes.length; i++) { 
     if (validTime(allowableTimes[i])) { 
      sendToSlack(res); 
     } 
    } 
     queryReddit(); 
} 

function validTime(allowableTime) { 
    var date = new Date(); 

    var hour = date.getHours(); 
    var minute = date.getMinutes(); 

    var allowableHour = allowableTime.getHours(); 
    var allowableMinute = allowableTime.getMinutes(); 

    return hour == allowableHour && minute == allowableMinute; 
} 

function queryReddit() { 
    setTimeout(function() {reddit.getHot('aww', {limit: 1}).then(handleReddit);}, 60000); 
} 

function sendToSlack(res){ 
      var url = res[0].url; 
      var title = res[0].title; 

      bot.sendWebhook({ 
       username: "bawwt", 
       icon_emoji: ":smile_cat:", 
       text: "<" + url + "|" + title + ">", 
       channel: "#random" 
      }); 
} 
+0

'reddit.getHot()'コールを意味すると仮定します。通話が完了するのを待ってもよろしいですか?私は 'sendToSlack'コールバックがそうであると思います。ノードでは、残りのサーバーをコールバックでブロックしないでください。 代わりに、 'sendToSlack'は、コールバックを処理し、' reddit.getHot() 'の別の呼び出しを起動してループを取り除く再帰関数にする必要があります – Monokh

+0

sendToSlack関数はreddit.getHot関数の結果を使用しますが、関数は決して完了せず、ノードは非常に素早くループしているように見えます。それが役に立ったら、sendToSlackの内容を追加します。 – uioporqwerty

答えて

1

:ここではそれ以下のソリューションが受け入れ答えのコードに基づいて、私のために働いていますランタイムはそれを行うチャンスです。それは単一のスレッドであり、無限にあなたのwhile(1)を使っています。スレッドをもっと忙しくしているときに約束が応答する解決ネットワークコールを実際に処理する機会はありません

コメントに記載されているとおりです。ノードでは、サーバーの残りの部分をブロックしないでくださいコールバックで。ただ、手のコード

オフ

var allowableTimes = 20; 
var times = 0; 
function handleReddit(res) 
{ 
    sendToSlack(res); 
    times = times + 1; 
    if(times < allowableTimes) 
    { 
     reddit.getHot('aww', {limit: 1}).then(handleReddit); 
    } 
} 

reddit.getHot('aww', {limit: 1}).then(handleReddit); 

:代わりに、

概念コードをreddit.getHot(に別の電話をオフにコールバックし、火災を扱うsendToSlack再帰関数を作る必要があります)とループを取り除きます

+0

これは、私がreddit APIのレート制限に達する原因にはならないでしょう。また、allowableTimesが十分高いと、最大関数呼び出しスタックサイズに達しますか? – uioporqwerty

+0

@uioporqwertyそれは別の問題であり、それはあなた次第です。レートを制限したい場合は、タイムアウトを設定してください。私は個人的には、あなたがこのインスタンスにあるべきであるように見える 'allowableTimes'の数が少なければ、このようにして問題を見ません。コールスタックの時間よりも何かを実行しようとしている場合(途中で途方もなく高い)次に、タイムアウト機能によってスタックサイズをリセットすることができます。 – Monokh

+0

@uioporqwerty また、私はこの場合、実際にどれだけ高い許容時間が経過しても起こるとは思わない。メソッド呼び出しはスタックには行きません。 'reddit.getHot'はコールバックをとり、次の呼び出しで生成された新しいスタックでなければなりません。 'reddit.getHot()'が同期的に起こった場合、これは問題になります – Monokh

関連する問題