2017-12-29 4 views
0

私は、ウィンドウブラインドの動きをシミュレートする非常に単純な関数を作成したかったのです。これは、directionパラメータで、ブラインドがUPDOWNになるか、またはSTOPになる必要があるかを示す要求を受け取るサーバーで実行されます。パラメータでJS clearTimeoutを使用するにはどうすればよいですか?

このシミュレーションは、directionパラメータが要求され、サーバはブラインドがMOVINGであると応答します。方向にかかわらず、動きはsetTimeout機能で見ることができるので、10秒間続く。サーバがdirection === STOPでリクエストを受信した場合、サーバはclearTimeoutに電話をかけて、ブラインドの動きを「停止」し、ブラインドがPARTLY_CLOSEDであると言って、別のブラインド状態に戻す必要があります。

これまでのところ、私はある方向の要求を送ると、サーバーはMOVINGで応答します。私がclearTimeoutを "移動"中に呼び出すと、実際には2番目のsetTimeout機能が開始されます。

私の質問は、コードを正しく作成する方法と、setTimeoutの機能をどのようにパラメータ設定するのですか?ここで

コードです:エンドポイントの内部

let blindState = "OPENED"; 
const blindMovementFunction = (direction) => setTimeout((direction) => { 
    console.log("### direction", direction); 
    if (direction === "UP") { 
     blindState = "OPENED" 
    } else if (direction === "DOWN") { 
     blindState = "CLOSED"; 
    } 
}, 10000); 

使用法:

if (req.query.direction === "STOP") { 
      console.log("### blindMovementFunction", blindMovementFunction); 
      clearTimeout(blindMovementFunction); 
      blindState = "PARTLY_CLOSED"; 
      res.send(blindState); 
     } else { 
      blindState = "MOVING"; 
      res.send(blindState); 

      blindMovementFunction(req.query.direction); 
     } 
+0

でタイムアウト-idのリターンを持続、それはsetTimeoutメソッドの呼び出しによって生成されたIDを使用する必要があります。 – Axnyff

+0

@Axnyffあなたのコメントを少し拡大できますか?すべてのスニペットはコード内の別の場所に配置されます。最初のスニペットは「グローバル」で、2つ目はリクエストのハンドラ関数内にあります。 IDをどこに割り当てる必要がありますか?リクエストハンドラ関数では? –

答えて

3

あなたはclearTimeoutに関数参照を渡している、それはsetTimeout()

によって返さtimeoutIDがグローバルに定義必要スコープ

var timeoutID; 

あなたは正しくてclearTimeoutを使用していないsetTimeout()方法

timeoutID = blindMovementFunction(req.query.direction) 

clearTimeout(timeoutID); 
+1

ありがとうございます!あなたのソリューションはうまくいきました。コード自体に接続されていない技術的なバンプがありました。再度、感謝します! –

関連する問題