2014-03-14 83 views
0

任何人都可以向我解释为什么我正在处理50条记录,但我从来没有得到console.log("all records processed");到控制台。如何确保您使用Javascript正确关闭您的函数?

这就像我正在关闭一个功能太早或太晚。使用回电时最好的方法是什么,因为我确信这就是为什么我没有得到"all records processed"。我正在使用节点v0.10.26与NPM oracle插件。

var oracle = require('oracle'); 

var connectData = { 
    hostname: "127.0.0.1", 
    port: 1521, 
    database: "xe", // System ID (SID) 
    user: "user", 
    password: "password" 
}; 

oracle.connect(connectData, function(err, connection) { 
    if (err) { 
     console.log("Error connecting to db:", err); 
     return; 
    } 
    connection.setPrefetchRowCount(50); 
    var reader = connection.reader("SELECT * FROM CARS", []); 
    function doRead(cb) { 
     reader.nextRow(function(err, row) { 
      if (err) return cb(err); 
      if (row) { 
       // do something with row 
       console.log("got " + JSON.stringify(row)); 
       // recurse to read next record 
       return doRead(cb) 
      } else { 
       // we are done 
       return cb(); 
      } 
     }); 
    } 
    doRead(function(err) { 
     if (err) throw err; // or log it 
     console.log("all records processed"); 
    }); 
}); 
+2

似乎你的代码没有错,也许'行'总是'真理'? –

+0

没有它最奇怪的事情,你拿出最后一个命令console.log(“所有记录处理”);并且预取行可以正常工作,但连接并未关闭,必须在某处需要分号! – justZito

+0

这是在黑暗中拍摄的,但是您是否尝试将doRead()函数放入根名称空间中,而不是将其嵌入到oracle.connect内? –

回答

0

是否有区别,你在connectData的大括号之后没有分号?就我个人而言,我只是设置了越来越多的控制台日志,直到我找出弄乱一切的线。如果可以的话,或者使用断点。

+0

谢谢,我加了半。但奇怪的是,每次你开始记录时它的行为都不一样,所以也许我错过了另一个? – justZito

+1

connectData之后的分号完全不会对控制流产生任何影响。事实上,除了当下一行的第一个字符是'['或'('。“时)时,几乎在任何情况下分号都是无用的。参见http://blog.izs.me/post/2353458699/an-open-letter- to-javascript-leaders-about。 – alex

0

对于这些一步一步的回调,我建议您使用async来管理回调金字塔。

+0

这是一个建议,不是对问题的回答,所以它应该是对问题的评论。 –

相关问题