2016-11-23 8 views
0

から私はsetTimeoutをしてやるべきことがたくさん持っている電報ボットプロジェクトに取り組んでいます。そして、現在私の問題は、私がすでにそれをmodule.exportsに入れても、タイムアウトをクリアできないということです。ノードJS - てclearTimeoutが前のインスタンスまたは状態

は、ここに私のprevious questionです。

問題は、私はタイムアウトをクリアするたびに、それは何もしない、です。タイムアウトはまだ続きます。

ここで私は約束

module.exports.timeouts = []; //general.timeouts 

と呼ばれるモジュールを得たと私は時はいつでもゲームそのモジュールに

canceledTimeout = function(res,bot) { 
    return general.timeouts.push(setTimeout(function() { 
     return updateState(general.THIRTY_SECONDS_REMAINING_CHECK_STATE, res) 
     .then (function(msg) { 
      if (msg !== null) { 
      return bot.sendMessage(res.chat.id, msg, general.baseFormat()) 
      .then (function(x) { 

       setTimeout(function() { 
       updateState(general.TIMEOUT, res) 
       .then (function(msg) { 
        if (msg !== null) { 
        return bot.sendMessage(res.chat.id, msg, general.baseFormat()); 
        } 
       }); 
       },30000); 

      });    
      } 
     }); 
     },90000)); 
} 

をsetTimeoutをオブジェクトを置くタイムアウト

var createSingleton = require('create-singleton'); 

var p3 = createSingleton(function mySingleton() { 
    service.canceledTimeout(res,bot) 
}); 

var myInstance3 = new p3(); 

を作成するために私のコードです/部屋が終了したら、私はこの機能を呼び出します。

clearTimeout(general.timeouts); 

しかしプレイヤーは再び部屋を作成した後、タイムアウトがまだ実行されます。

問題はタイムアウトがクリアされていないと思います。それは私の視点からです。

ご意見やご協力をお待ちしております。 おかげ

答えて

2

は、私は、少なくとも二つの問題を参照してください。

  1. あり setTimeoutコールがある、とあなたがそれらのいずれかのハンドルを覚えていません。その秒の30秒タイマーをキャンセルしたくない場合、それは問題ありませんが、私はそれを呼び出すべきだと思いました。

  2. clearTimeout単一のタイマーハンドルを受け入れますが、あなたはそれをここに配列渡している:

    clearTimeout(general.timeouts); 
    

    を代わりに、個別にそれらをクリアする必要があります:

    に従い
    general.timeouts.forEach(function(handle) { clearTimeout(handle) }); 
    

    (あなたが受け取った余分な引数がそれを気にかけないことをテストするなら、それをgeneral.timeouts.forEach(clearTimeout);に短縮することができるかもしれません。しかし、もう一度、forEachはそのコールバックを3つのargsそれを使用する前にテストしてください)。

+0

こんにちは、ありがとう。最初にチェックし、結果を更新します。歓声 – Webster

+1

マン、真剣に?あなたは今すぐ頭痛を治しました! 2番目のタイムアウトを配列に追加しました。私を助けるためにあなたの時間を費やしてくれてありがとう。私は、マークしていただきありがとうございます! – Webster

0

コードソースには2つの問題があります。

まず、あなたがあなたの関数に2つのタイマーがあります。 のsetTimeout(...、90000) と たsetTimeout(...、30000)

第二に、あなたはてclearTimeoutメソッドに配列を渡すことはできません。それは効果がありません。 アレイ内のタイマーをクリアするには、1つずつクリアする必要があります。例:

var timeouts = [timer1, timer2, timer3]; 
//loop through the array and clear them one by one 
for (var i = 0; i < timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 
+0

問題を人に指摘してくれてありがとう、そしてええ、それは実際問題です。ありがとう – Webster

関連する問題