1

ノード memcached には、次のようgetな memcachd キー値を取得する機能があります。

memcached.get( "hello",function( err, result ){
if( err ) console.error( err );
this.r = result;
console.dir( result );
memcached.end();});

関数の 2 番目の引数は、コールバック関数
内のコールバック関数です。キーの値を簡単にログに記録できます。プロパティを
割り当てようとしましたが、外部関数の結果をログに記録しようとすると発生します。 コードの何が問題になっていますか?rmemcachedmemcached.rgetundefined

4

1 に答える 1

0

変数のように見え、多くの場合、変数のように動作しますがthis、実際には変数ではないため、クロージャでは変数のように動作しません。ある関数が別の関数の中にネストされている場合、内側の関数は完全に新しいバージョンを取得thisし、外側の関数の と同じものを指す可能性はほとんどありませんthis

したがって、内部関数内の外部関数を参照する必要がある場合thisは、最初にそれを真の変数にコピーする必要があります (ほとんどの人はそれを呼び出すのが好きですselfが、一部の人は を好みthatます)。次に、内部関数でその変数を参照します。

ただし、あなたの場合、割り当て可能な実際の変数、つまり が既にあるので、コールバックで に置き換えるmemcachedだけです。これは、コールバックによって作成されたクロージャーの適切な範囲の外部変数です (その中で使用できるという事実からわかるように)。thismemcachedmemcached.end()

[コメントに記載されているコードの正しい形式のバージョンを含めるように更新]

memcached.get = function get(key, callback) {
  if (Array.isArray(key)) return this.getMulti.apply(this, arguments);
  this.command(function getCommand (noreply) {
    return { key: key , callback: callback ,
      validate: [['key', String], ['callback', Function]] ,
      type: 'get' , command: 'get ' + key };
  });
};

複数の関数を非同期で呼び出そうとしているようでreturn、それらからの値を期待しています。それは単にうまくいきません。

于 2012-08-31T02:44:50.017 に答える