2012-01-21 1 views
0

私は、これはコードJS持っている:コールバックとして関数を渡すには?

Download.prototype.insert = function(stocks, exchange, cb){ 
    var self = this 
     , count = stocks.length  

    stocks.forEach(function(stock){  
     save(stock, done) 
    }) 

    function save(stock, cb){ 
     self.mysql.query("my query", [exchange.id, stock.Symbol], function(err, rows){ 
      if (rows && rows.length > 0) 
       self.mysql.query("my query", [rows[0].id, stock.DateTime, stock.Close], cb) 
      else cb() 
     })  
    } 

    function done(){     
     count-- 
     if (count === 0) return cb()   
    } 
} 

あなたは私がsave()関数にコールバックを渡す見ることができるように、私はfunction(err, rows){ .... }

の問題を使用しないようにクエリを分離できるかどうかを知りたいとその関数は2つのパラメータerrrowsを待っているので、カスタム第3パラメータ(cb()関数)も渡すにはどうしたらいいですか?

おかげ

+3

匿名の 'function(err、rows)'の内部では、依然として外側のスコープから 'cb'を参照することができるので、あなたのやり方は大丈夫だと思います。 'cb'をもう一度渡す必要はありません。 –

+0

これも私の最初の考えでしたが、Dailはクエリを分離したいだけで、mysql.queryに "done"コールバックパラメータを含むコールバック関数を渡す方法を探していたと思います。 –

+0

afaikがダウンしていますjqueryのコールバックはparamsを受け入れることができます。あなたが渡しているコールバックがparamsを取るかどうかについては、あなたが判断します。[this](http://jsfiddle.net/dafastestfingers/EBLx8/1 /)を実行し、パラメータで遊びます –

答えて

3

私はあなたの質問は、あなたのコールバックパラメータをラップするには、右^^

を理解願って、あなたは匿名関数(実際のコールバック)を返す関数を作成することができます。 cbパラメータは、匿名関数のコンテキストにラップされます。

function queryDetails(cb){ 
    return (
    function(err, rows){ 
     if(rows && rows.length < 0){ 
     //mysql.query ... 
     }else{ 
     cb() 
     } 
    }) 
}; 
mysql.query("query", ...., queryDetails(doneCallback)); 

楽しくお楽しみください!

関連する問題