この例を見てください
var s;
cb = function(error,result){
s = result;
}
memcached.get('hellow',cb);
console.log(s);
これは私に与えますundefined
。コードの何が問題になっていますか?
非同期であるためconsole.log
、定義後に実行する必要があります。s
var s;
cb = function(error,result){
s = result;
console.log(s);
}
memcached.get('hellow',cb);
利用可能になるまで呼び出されないため、関数が実行さconsole.log(s);
れる前に行が実行されます。これは、node.js の I/O 操作で発生する古典的な非同期性です。cb
cb
memcached.get
result
変数sは、コールバック関数内で初期化されています。このコールバック関数は、memcached.get() が「hello」のデータの取得を完了したときにのみトリガーされます。
Javascript は、イベント ループ メカニズムに依存しています。これは、JavaScript ランタイムが、コールバックの発生をブロックすることなく、最後に到達するまでスクリプトを実行し続けることを意味します。
あなたの例の結果として、javascript ランタイムは、memcached.get('hello',cb)行の直後にconsole.log(s)行をブロックせずに実行します。したがって、あなたの場合の console.log(s) は、 cbが最後の行の前に実行された場合にのみ、有効な値 ( undefined以外) を出力します。
より一貫した結果を得るには、 console.log(s)の行をコールバック関数内に移動してください。