0

次の例があります。

var first=setInterval(function() {  
var t=new Date();  
console.log("Started: ",t);  
sleep(function(){  
    var t=new Date();  
    console.log("Finished: ",t);  
});  
},500);  

function sleep(callback){  
for (var i=0;i<10000000000;i++){  
     //waiting
  }  
  callback();  
 }  

IMHO sleep は非同期で実行する必要がありますが、そうではなく、次のように出力されます。

Started:  Mon Mar 04 2013 12:31:10 GMT+0200 (EET)  
Finished:  Mon Mar 04 2013 12:31:23 GMT+0200 (EET)  
Started:  Mon Mar 04 2013 12:31:24 GMT+0200 (EET)  
Finished:  Mon Mar 04 2013 12:31:36 GMT+0200 (EET)  
Started:  Mon Mar 04 2013 12:31:36 GMT+0200 (EET)  
4

1 に答える 1

1

setIntervalコールバックへの前の呼び出しがまだ実行されている間、コールバックへの次の呼び出しをトリガーしません。関数は決して非同期ではないためsleep、後続のsetIntervalコールバックを保留します。

ブラウザーでは、Web ワーカーの使用を除き、すべての JavaScript コードが単一のスレッドで実行されます。あなたのコードは、 が実行される状況を設定しようとしているように見えます。sleepその後、 からの後続のコールバックがsetInterval起動され、実行中の 2 番目のスレッドが開始されますsleep。それは起こりません(上記を参照)。

ただし、Web ワーカーを使用してそのようなことを行うことはできますが、実行時間の長い操作がある場合は、JavaScript のメイン スレッドから (それらをサポートするブラウザーで) 実行したい場合があります。

于 2013-03-04T10:42:35.297 に答える