2016-08-30 21 views
1

JavaScriptで初めてsetIntervalを学習していて、5秒後に値を表示しようとしています。私のコードは以下のとおりである:setInterval関数は未定義に戻ります

<button onclick="myTest()">Try it</button> 

<script> 
function myTest() { 
    const ret = myFunction(); 
    alert(ret); 
} 

function myFunction() { 
    let i = 0; 
    const interval = setInterval(function(){ 
     i += 1; 
     if (i === 5) { 
      clearInterval(interval); 
      return i; 
     } 
    }, 1000); 
} 
</script> 

は私が5を警告したい、代わりに私がundefinedを取得しています。誰がなぜこれが起こっているのか知っていますか?前もって感謝します!

+1

'myFunction'は実際に何も返しません。 – Phylogenesis

+0

'setInterval'呼び出し内の無名関数から何も返すことはできません。その関数内から 'console'に書き込む必要があります –

+0

実際に' ret'と 'interval'を' const'として宣言する必要はありません。 –

答えて

2

setIntervalコール内の無名関数から何も返すことはできません。その機能内からconsoleに書き込む必要があります。私は窓(私は推測)に、ではないのMyFunctionに返送されます

function myTest() { 
 
    // this function is now redundant - you could call myFunction() directly 
 
    myFunction(); 
 
} 
 

 
function myFunction() { 
 
    let i = 0; 
 
    const interval = setInterval(function() { 
 
    i += 1; 
 
    if (i === 5) { 
 
     clearInterval(interval); 
 
     console.log(i); // this will appear after 5 seconds... 
 
    } 
 
    }, 1000); 
 
} 
 

 
myTest();

+0

はい、うまくいきました!私はsetInterval関数から戻ってこないことを知らなかった。どうもありがとう! – user3033194

+1

非同期コードの一般的なルールです。同期的に値を返すことはできません –

1
return i; 

:これを試してみてください。

myFunctionは、リターンを書き込まなかったため、デフォルトでは未定義です。

function myTest() { 
    myFunction(function(val){ 
     alert(val); 
    }); 
} 

function myFunction(callback) { 
    let i = 0; 
    const interval = setInterval(function(){ 
     i += 1; 
     if (i === 5) { 
      clearInterval(interval); 
      if(callback){ 
       callback(i); 
      } 
     } 
    }, 1000); 
} 

コールバック関数で値を取得できます。

1

アラート(ret)は5秒が経過する前に発生し、したがって私の関数は未定義に戻ります。この方法を試してみてください。

<button onclick="myTest()">Try it</button> 
<script> 
function myTest() { 
myFunction(); 
} 
function myFunction() { 
var i = 0; 
var interval = setInterval(function(){ 
    i++; 
    if (i === 5) { 
    alert(i); 
     clearInterval(interval); 
    } 
    }, 1000); 

} 
</script> 
関連する問題