为什么我的Promise链任务同时执行、没有按预期顺序运行?
问题原因
- 你定义的
openDBPromise没有等待数据库连接完成就提前调用resolve(),无法保证后续操作在数据库打开成功后执行 sqlite3的db.get是回调风格的异步API,你没有将它包装为Promise返回,导致第一个then执行完db.get调用就立刻触发了下一个then,不会等待查询回调执行完成,才会出现输出顺序错乱、拿到的data为undefined的问题
修正后代码
let selectGP = 'select gp from Money where userID = ? and guildID = ?'; let db; // 修正openDB逻辑,等待数据库连接完成再resolve const openDB = new Promise((resolve, reject) => { db = new sqlite3.Database('./Toothless.db', (err) => { if (err) { console.error(err.message); reject(err); return; } resolve(); }); }); openDB.then(() => { console.log('here1'); // 将db.get包装为Promise返回,让then链等待查询完成 return new Promise((resolve, reject) => { db.get(selectGP, [interactionUserID, interactionGuildID], (err, row) => { if (err) { console.log('in test > select GP'); reject(err); return; } const userGP = row.gp; console.log('usergp in get is ' + userGP); resolve(userGP); }); }); }).then((data) => { console.log('here2'); console.log('usergp is '+ data); interaction.reply({ content: 'you have ' + data , ephemeral: true }); db.close(); }).catch(() => { console.log('in catch'); });
修改说明
- 调整
openDB的Promise逻辑,把resolve放到数据库打开的回调里,连接出错直接reject抛出错误,确保只有连接成功才会执行后续查询操作 - 把
db.get的回调逻辑包装成Promise返回,查询成功就把结果resolve出去,查询失败就reject,这样then链会等待查询完成再执行后续的输出和回复逻辑,输出顺序就和预期一致
内容的提问来源于stack exchange,提问作者Toothless LL
相关产品推荐
相关产品推荐

