2012-01-21 65 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){ .... }

问题该函数是否等待两个参数errrows,那么如何传递一个自定义的第三个参数(cb()函数)?

感谢

+3

我认为你所做的方式是可以的,因为在匿名'函数(err,rows)'里面,你仍然可以从外部作用域引用'cb'。你不必再次通过'cb'。 –

+0

这也是我的第一个想法,但我认为Dail只是想分开查询,并正在寻找一种方法将回调函数(包括“完成”回调参数)传递给mysql.query .. –

+0

afaik它已关闭到写回调的人来包含任何所需的参数,即jquery的回调可以接受参数,关于你传递的回调是否带有参数,参见[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)); 

玩得开心!

相关问题