2017-07-07 6 views
0

コールバック関数で練習していましたが、この質問はわかりません。Settimeoutがすぐに返ってこない

function foo() {  
    var data = 10;  
    bar(function (players) { 
    data = players; 
    });  
    return data; 
} 

function bar (callback) { 
    setTimeout(callback, 0); 
} 

var result = foo(); 

data = playersから未定義の結果が予想され、プレイヤーには何も渡されません。 setTimeout関数は0を遅延として使用するため、最初に実行してからデータを返すべきではないでしょうか?私はMDNのページを見て、>=4msにネストされたタイムアウトのためのスロットルに関する情報があるようです。この場合も同様ですか?

+0

setTimeoutは非同期呼び出しです –

答えて

1

setTimeout関数は遅延として0を使用するため、最初に実行してからデータを返すべきではありませんか?

いや、でも0の遅延で、setTimeoutに渡されたコールバックはnext tick of the event loopで実行するようにスケジュールされています。

つまり、の後にコールバックがに実行されることが保証されています。現在の実行が完了するまで実行されました。

+0

"キューに他のメッセージがない場合、メッセージはすぐに処理されますが、メッセージがある場合、setTimeoutメッセージは他のメッセージが処理されるまで待たなければなりません。 setTimeoutが遅れているので、私はすでにキューに入っている "メッセージ"を関数呼び出しと推測していますか? – James

+0

必ずしもそうではありません。しかし、待ち行列は、現在のコードが終了した後にのみ*調べられます。私。 'var result = foo();'の実行後にのみ実行されます。 –

関連する問題