3

Node.js は、非同期、イベント ドリブン、ノンブロッキング I/O であると言われていますが、スクリプトが非同期かどうかを確認するにはどうすればよいですか? それともノンブロッキング?

4

2 に答える 2

2

以下を含む非同期関数のリストがあります。

process.nextTick( ... )

setTimeout( ... )
setInterval( ... )

ファイル システムモジュールから:

var fs = require( 'fs' );
fs.rename( ... )
fs.stat( ... )
fs.readFile( ... )
fs.writeFile( ... )
fs...

さらに多くの場合fs、基本的に非同期には、最後に「Sync」サフィックスが付いた同期バージョンがあります(ただし、同期バージョンは避ける必要があります)。

他にもたくさんの例があります。EventEmittersは非同期 ( HTTP サーバーストリームなど) と見なすことができますが、技術的にはそうではありません (非同期操作に依存します)。

基本的に、パラメーターとして受け入れるほとんどすべてcallbackが非同期です (または非同期操作に依存します)。次に例を示します。

process.nextTick( function( ) { // <--- the callback
    console.log( 'nextTick' );
});
console.log( 'test' ); // <--- will fire before the callback, i.e. asynchronouos

これは明らかに規則ではないことに注意してください。注目すべき例:

var arr = [ 1, 2, 3 ];
arr.forEach( function(el) { // <--- the callback
    console.log( el );
});
console.log( 'test' ); // <--- will fire after the callback, i.e. synchronous

したがって、同期コードは、行ごとに実行されるコードであり、行の順序が重要です。非同期コードは逆です。行の順序 ( ほぼ ) は重要ではありません。の例では、とprocess.nextTickの順序を変更できますが、結果は同じです。process.nextTickconsole.log('test')

ドキュメントを読み、すべての基本的な非同期関数を覚えるようにしてください。

もう 1 つのアドバイス: 学習する最善の方法は、実行して学習することです。;-)

于 2012-09-27T08:23:37.517 に答える
2

コードを読んでください ;) ライブラリが非同期であることは、多くの場合、継続またはメッセージ パッシング スタイルのコードを容易にするため、かなり明白です。多くの場合、意図的にコール ブロックを作成し、それがどのように反応するかを確認できます。またはそれ以上: コードをプロファイリングします。

「入力コードは非同期か同期か」に対して真または偽に答えることができるツールを知りません:)

または、コードまたはその他のコンテキストを共有できます:)?

編集:

ブロッキングまたは非非同期コードの例を教えてください。– 六シアン化物

この質問には、これに関する議論があります: JavaScript 同期はいつですか?

同期コードは次のようになります。

console.log("first");
console.log("second");
console.log("third");

これらの 3 行のコードは同期的に実行されます (1 行目、2 行目、3 行目)。

逆に、このコードは非同期で実行されます。

function f() {
    alert("first");
}
function g() {
    alert("second");
}

// defer execution for 1000 ms
setTimeout(f, 1000);
// defer execution for 500 ms
setTimeout(g, 500);
// run immediately
alert("third");

最初に「3 番目」のアラートが表示され、次に「2 番目」、最後に「1 番目」のアラートが表示されます。これは非常に不自然な例ですが、コールバック (f と g) と、フローが同期コードと根本的に異なることがわかります。

同期コードを読むことができ、ほとんどのことはそれらを読んだように起こりますが、非同期コードではイベントが発生したり、コールバックが呼び出されたりし、実行パスは同期ブロック コードほど明確ではない場合があります。

Node.js は非同期コードの例です。ほとんどの関数呼び出しは、成功、失敗、およびその他の適用可能なコールバック パラメーターのセットを受け取ります。

EDIT2:

このリンクには、同期/非同期スタイルで記述された同じコードを使用した Javascript の例がいくつかあります: Node.js を使用した非同期コード設計

于 2012-09-25T02:07:44.290 に答える