5

私は疲れているかもしれないと思いますが、私の人生ではこれを理解することはできません.javascriptの知識が不足しているためだと思います.

var itv=function(){
 return setInterval(function(){
  sys.puts('interval');
 }, 1000);
}
var tout=function(itv){
 return setTimeout(function(){
  sys.puts('timeout');
  clearInterval(itv);
 }, 5500);
}

これらの2つの関数で私は呼び出すことができます

a=tout(itv());

基本的に、ループタイマーを5.5秒間実行してから終了します。



私の論理では、これは機能するはずですが、単にそうではありません

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  });
 }, 5500);
}

この問題に関する洞察をいただければ幸いです。

4

3 に答える 3

9

setIntervalタイムアウト後に呼び出されるため、機能しません。元のアプローチは正しく、これを単一の関数にラップできます。

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};
于 2010-03-17T18:02:16.237 に答える
4

あなたが犯している間違いは、関数が実行を返さitvず、setIntervalが生成するIDを返すことだと思います。次に、その ID が関数に渡され、実行中の処理が停止されます。setInterval(function(){ sys.puts('interval'); }, 1000)setInterval(function(){ sys.puts('interval'); }, 1000)clearIntervalsetInterval(function(){ sys.puts('interval'); }, 1000)

編集:機能する1つの機能の例。

var dotime=関数(){
 // 間隔を開始し、ID を保存します
 var intervalId = setInterval(関数(){
  // これは間隔ごとに実行されます
  sys.puts("間隔");
 }、1000);

 // タイムアウト関数を開始します
 setTimeout(関数(){
  // これはタイムアウトが発生したときに実行されます
  clearInterval(intervalId); // 間隔がもう発生しないようにします
 }、5500);
}
于 2010-03-17T17:59:21.547 に答える
1

これは、バージョンを記述する別の方法です。関数を clearInterval に渡していることがわかります。ここで、タイマー ID を渡す必要があります。

var dotime=function(){
 var g=function(){
  var f=function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }
  clearInterval(f);
 }
 return setTimeout(g, 5500);
}

それを機能させるには、関数を呼び出す必要があります:

  clearInterval(f());

または、あなたのバージョンを使用して:

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }());
 }, 5500);
}

免責事項:私はこれをテストしませんでした。

于 2010-03-17T18:05:08.273 に答える