Javascript pdfKit "Ошибка: запись после завершения" из-за закрытого потока...?
Я закрываю свое записывающее соединение в блоке finally, но даже после перехода в этот блок программа, похоже, возвращается в блок 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". Спасибо за помощь!!!
Тим
РЕДАКТИРОВАТЬ
Я попытался переписать код, например, с помощью обратных вызовов, но он все еще не работает так, как должен
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();
});
});
}
1 ответ
Ваш try/catch/finally
Блок работает синхронно. Это ударит finally
в первом тике цикла событий JS. Однако (я предполагаю, основываясь на структуре обратного вызова), con.query()
функция асинхронная. Это означает, что он будет работать по крайней мере через тик после вашего наконец. Таким образом, это всегда будет работать после всего, что в конечном итоге.
Если вы хотите, чтобы он работал должным образом, изучите асинхронные методы достижения try/catch/finally
состав. Существуют миллионы способов скинуть кошку в отношении этого, асинхронной библиотеки, обещаний и т. Д. Или просто сохранить любой код, который вы хотите запустить после соединения, в обратном вызове соединения.
В любом случае, проблема заключается в комбинации синхронизирующего и асинхронного кода, работающего рядом друг с другом.