You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的Promise链任务同时执行、没有按预期顺序运行?

问题原因

  1. 你定义的openDB Promise没有等待数据库连接完成就提前调用resolve(),无法保证后续操作在数据库打开成功后执行
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:24:04