1

この例を見てください

var s;
cb = function(error,result){
s = result;
}
memcached.get('hellow',cb);
console.log(s);

これは私に与えますundefined。コードの何が問題になっていますか?

4

3 に答える 3

1

非同期であるためconsole.log、定義後に実行する必要があります。s

var s;
cb = function(error,result){
    s = result;
    console.log(s);
}
memcached.get('hellow',cb);
于 2012-09-02T15:46:51.680 に答える
1

利用可能になるまで呼び出されないため、関数が実行さconsole.log(s);れる前に行が実行されます。これは、node.js の I/O 操作で発生する古典的な非同期性です。cbcbmemcached.getresult

于 2012-09-02T15:43:10.523 に答える
1

変数sは、コールバック関数内で初期化されています。このコールバック関数は、memcached.get() が「hello」のデータの取得を完了したときにのみトリガーされます。

Javascript は、イベント ループ メカニズムに依存しています。これは、JavaScript ランタイムが、コールバックの発生をブロックすることなく、最後に到達するまでスクリプトを実行し続けることを意味します。

あなたの例の結果として、javascript ランタイムは、memcached.get('hello',cb)行の直後にconsole.log(s)行をブロックせずに実行します。したがって、あなたの場合の console.log(s) は、 cbが最後の行の前に実行された場合にのみ、有効な値 ( undefined以外) を出力します。

より一貫した結果を得るには、 console.log(s)の行をコールバック関数内に移動してください。

于 2012-09-02T16:11:17.440 に答える