2017-08-17 5 views
1

次の例では、変数 'id'を 'set'エミッタのリスナーに渡す方法を理解する必要があります。私の問題は、updateStore(req.id)のようなハンドラを介して渡すことができないということです。mongoStoreからのイベント 'update'には、それが返す独自の戻り値 'mongoId'があります。ネストされたエミッタ変数をイベントリスナーのコールバックに渡す

また、req.idを参照することはできません。これは、値を変更するapp()への別の要求によって変更されないという保証はないからです。ハンドラが開始された時点で、updateStoreハンドラ内のreq.idとmongoIdの両方にどのようにアクセスすればよいでしょうか?

このサンプルコードは実行されず、はるかに大きなプログラムの削除されたバージョンです。私は達成しようとしているものの背後にある論理を提供したいと思っていました。

var self = this; 
var app = express(); 
var mongoStore = new MongoStore({url:'/path/to/mongo'}); 

function updateStore(mongoId) { 
    if (mongoId == req.id) { 
     // do something 
     self.emit('complete'); 
    } 
} 

app.get('/*', function(req,res) { 
    // req.id needs to get passed to updateStore() 
    mongoStore.on('update',updateStore); 

    self.on('complete', function() { 
     self.removeListener('update',updateStore) 
    } 
}); 

答えて

1

ではJavaScript Function.prototype.bind方法

をよく見てこれは、最初の引数は、コピー機能の範囲内this値であり、与えられた機能

  • のコピーを返します。
  • 次の引数は、コピーされた関数で使用される引数です。我々の場合には

、我々はupdateStore機能のコピーを作成するには、このメソッドを使用しており、このようなそのコピー機能のthis値としてオブジェクトリテラルに包まれreqオブジェクトの参照を、使用することができます。 updateStore.bind({ req: req })。そうすれば、内部でthis.reqにアクセスするだけで済みます。

var self = this, 
    app = express(), 
    mongoStore = new MongoStore({url:'/path/to/mongo'}); 

function updateStore(mongoId) { 
    var req = this.req; 

    if (mongoId == req.id) { 
     // do something 
     self.emit('complete'); 
    } 
} 

app.get('/*', function(req,res) { 
    var onStoreUpdated = updateStore.bind({ req: req }); 

    mongoStore.on('update', onStoreUpdated); 

    self.on('complete', function() { 
     self.removeListener('update', onStoreUpdated); 
    }); 
}); 
+0

ありがとうございます! –

関連する問題