我必须使用多个SQL请求。因此,我创建了一个Promise来做到这一点。但是我需要将此承诺用于相同的承诺。当我尝试使用“ connection.end()”停止SQL连接时,在控制台中出现此错误:
错误:调用退出后无法使查询入队。
如果我不写“ connection.end()”,则我的代码有效。
function requete( sql ) {
return new Promise( ( resolve, reject ) => {
this.connection.query( sql, ( err, rows ) => {
if ( err )
return reject( err );
resolve( rows );
} );
} );
}
myRouter.route('/profil/verifBadge')
.get(function (req, res) {
var tabBadgeAjoute = [];
var tabVerifBadge = [];
//Etape 1
requete("my SQL request")
.then( (rows) => {
if (rows.length != 0){
for (let competence of rows){
if (competence.TotalLike >=5) { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
if (competence.TotalLike >=10) { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
if (competence.TotalLike >=25) { tabVerifBadge.push("one SQL request"); tabBadgeAjoute.push(myString)}
if (competence.TotalLike >=100) { tabVerifBadge.push("one SQL request" ); tabBadgeAjoute.push(myString)}
}
}
})
//Etape 2
.then( () => {
for (let requeteSQL in tabVerifBadge){
requete(tabVerifBadge[requeteSQL].toString())
.then( (rows2) => {
if (rows2.length == 0){
requete("one SQL request")
.then(() => console.log("ok")
.catch( err => console.dir(err));
};
})
.catch( err => console.dir(err));
}
})
.then( () =>
res.send(JSON.stringify({"status": 200, "error": null, "response": "ok"}))
)
.then((rows) => connection.end())
.catch( err => {
// handle the error
console.dir(err);
})
})
答案 0 :(得分:0)
在第一个Promise中有一个for...of
循环,在第二个Promise中有一个for...in
循环。您不能保证在调用最后一个.then()
以关闭连接时,这两个Promise中的查询将完成。
尝试类似的事情:
.then(async function() {
for (let requeteSQL in tabVerifBadge){
await requete(tabVerifBadge[requeteSQL].toString())
.then( (rows2) => {
//...
})
.catch( err => console.dir(err));
}
})
另请参见此question。