2016-11-05 22 views
0

ちょっと前にnode.jsで開発を始めました。最近、ノードの「event loop」と非同期メカニズムに、deepdiveを実行しました。しかし、まだ私は完全にsync and async callbacksの違いを理解していない。Node.js:非同期コールバックvs同期コールバックvs process.nextTick vs setTimeout

この例では、node.js APIから、どの関数が最初に呼び出されるのかわかりません。

maybeSync(true,() => { 
    foo(); 
}); 
bar(); 

しかし、私たちが持っていた場合:

それは、彼らが常に同期順序で実行されている理由は私にははっきりしていない
syncOrAsync(arg,() => { 
if (arg) { 
    cb(arg); 
    return; 
} 
}); 

syncOrAsync(true, function(result) { 
    console.log('result'); 
}); 

console.log('after result); 

、私は後にイベントループで実行する必要があり、コールバック関数をしましたが、スタックが空です(console.log( 'after result')が終了しました)。私はいつも非同期を得るためにprocess.nextTick(cb);を追加する必要がありますか?そして、process.nextTickとsetTimeout();の違いは何ですか?

+1

タイマーや外部呼び出しなど、実際には非同期なものがない限り、コードは常に同期します。つまり、すべてのJavaScriptコードのデフォルト状態です。コールバックを追加しても非同期にはなりません。 – adeneo

+0

私はいつも 'process.nextTick()'を追加する必要がありますか? – wizard

+0

いいえ、非同期のものを追加する必要があります。 – adeneo

答えて

3

タイマーや外部呼び出しなどのような実際に非同期のものがない限り、コードは常に同期しているため、すべてのJavaScriptコードのデフォルト状態です。
コールバックを追加すると、それは非同期コードprocess.nextTick()本当に機能が非同期にするが、それはありませんを使用して

function syncOrAsync(sync, cb) { 
 
    if (sync) { 
 
     return cb(); 
 
    } else { 
 
     setTimeout(cb, 100); // async, waits 0.1 seconds to call callback 
 
    } 
 
} 
 

 
syncOrAsync(true, function(result) { // synchronous call 
 
    console.log('result 1'); // happens first 
 
}); 
 

 
syncOrAsync(false, function(result) { // asynchronous call 
 
    console.log('result 2'); // happens last, as it's async 
 
}); 
 

 

 
console.log('result 3');  // happens second


の一例です。ここ

を非同期ことはありません。やや同じですか

function syncOrAsync() { 
    console.log('result 1'); // this happens last 
} 

process.nextTick(syncOrAsync); 

console.log('result 2'); // this happens first 

これは、イベントループの周りを次回通過するまでsyncOrAsyncの実行を延期するので、多くの点でsetTimeout(syncOrAsync)と同じですが、関数はまだ非同期ではないため、コールバックはすぐに実行されます。関数の実行全体を遅らせるだけです。

+0

それで、あなたが正しいことを理解すれば。 node.jsにおける非同期の真のパワーは、データベース、ファイルの読み込み、リンク要求などのようなリソースを扱うときに作用します。多くのI/O操作を実行しています。あなたが 'process.nextTick();'や 'setTimeout(cb);でそれらをラップしない限り、他のものは動作同期しています。 ' – wizard

+1

はい、JavaScriptは同期スレッドであり、すべてが書かれた順序で発生します。非同期コードは、ほとんどの場合、非同期関数でビルドされています。ブラウザでは、Ajax、タイマーなどであり、Nodeでは、OS、データベース検索などの呼び出しです。 – adeneo

関連する問題