Javascript pdfKit“错误:结束后写”由于封闭stream…?

我在“finally”块中closures了我的写入连接,但即使进入这个块,程序似乎又回到了try块。 这里是代码:

function printAllAssetsAndThreats(startX, startY) { try { con.query("SELECT * FROM Kunde1Assets;", function (err, result, fields) { for (var i in result) { console.log("b"); myDoc.font('Helvetica-Bold') .fontSize(20) .text('str', startX, startY); var xxx = result[i].KundenAssetID; startY = startY + 50; //jetzt jeweils alle gefährdungen: var sql = "SELECT DISTINCT c.AID, b.GID, b.Name, c.Name AS Asset FROM Kunde1Verbindungen a, Gefährdungen b, Kunde1Assets c WHERE a.KundenAssetID = \"" + xxx + " \"AND a.GID = b.GID AND c.KundenAssetID = a.KundenAssetID"; con.query(sql, function (err, result2, fields) { for (var i2 in result2) { } }); /////////////////// } }); } catch (e) { } finally { console.log("a"); end(); } } 

所以即使在打印“a”之后,控制台上也会印有“b”字样。 感谢您的帮助 !!!

蒂姆

编辑

我已经尝试用callback重写代码fe,但它仍然不能正常工作

 start(()=>{ myDoc.end(); }); function start(callback){ console.log("hello"); myDoc.font('Helvetica-Bold') .fontSize(20) .text('str', 44,44); con.query("SELECT * FROM Kunde1Assets;", function (err, result, fields) { console.log("hello"); var counter=0; for(var i in result){ console.log("hello"); start2(result[i].KundenAssetID, ()=>{}); counter++; if (counter==result.length){ console.log("yo");break;callback(); } if (counter==result.length){ console.log("yo");callback(); } } // }); } function start2(kaid, callback){ var sql = "SELECT DISTINCT c.AID, b.GID, b.Name, c.Name AS Asset FROM Kunde1Verbindungen a, Gefährdungen b, Kunde1Assets c WHERE a.KundenAssetID = \"" + kaid + " \"AND a.GID = b.GID AND c.KundenAssetID = a.KundenAssetID"; con.query(sql, function (err, result2, fields) { for (var i2 in result2) { console.log(kaid +"---"+ result2[i2].Name); myDoc.font('Helvetica-Bold') .fontSize(20) .text('str', 44,44); } }); } 

编辑:试了一下承诺(还没有工作)

 myDoc.pipe(fs.createWriteStream('node.pdf')); var promise = start(); promise.then(function(result){ console.log(result); myDoc.end(); }) function start(){ return new Promise (function(resolve, reject){ con.query("SELECT * FROM Kunde1Assets;", function (err, result, fields) { console.log(result); for (var i in result){ myDoc.font('Helvetica-Bold') .fontSize(20) .text(result[i].Name, 30, 20+(i*30)); var promise2 = start2 (result[i].KundenAssetID); promise.then(function(name){ for (var i2 in name){ myDoc.font('Helvetica-Bold') .fontSize(20) .text('result[i].Name', 30, 20+(i2*30)); } }); } resolve(result); if (Error) reject(); }); }); } function start2(kaid){ return new Promise(function( resolve, reject){ var sql = "SELECT DISTINCT c.AID, b.GID, b.Name, c.Name AS Asset FROM Kunde1Verbindungen a, Gefährdungen b, Kunde1Assets c WHERE a.KundenAssetID = \"" + kaid + " \"AND a.GID = b.GID AND c.KundenAssetID = a.KundenAssetID"; con.query(sql, function (err, result2, fields) { for (var i2 in result2) { //console.log(kaid +"---"+ result2[i2].Name); } resolve(result2); if (Error) reject(); }); }); } 

你的try/catch/finally块是同步运行的。 它会在JS事件循环的第一个勾号内打到finally 。 然而(我假设,基于callback的结构), con.query()函数是asynchronous的。 这意味着它会在你终于在至less滴答。 因此,这将永远在最后的一切之后运行。

如果您希望按预期工作,请查看实现try/catch/finally结构的asynchronous方法。 关于这个问题,asynchronous库,承诺等等,有上百万种方法来处理猫。或者,在连接callback之后,保留任何想要运行的代码。

无论哪种方式,问题是一起运行的同步和asynchronous代码的组合。