最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何使异步等待工作调用数据库的功能

运维笔记admin11浏览0评论

如何使异步等待工作调用数据库的功能

如何使异步等待工作调用数据库的功能

我有一个异步函数processWaitingList()需要等待另一功能findOpenVillage(的结果)是得到它是从我的数据库中的数据。

我收到以下错误,不明白为什么:

(节点:2620)UnhandledPromiseRejectionWarning:类型错误:未定义无法读取属性 '0' 在processWaitingList(XX \ server.js:151:36)在process._tickCallback(内部/过程/ next_tick.js:68:7)(节点: 2620)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。起源或者通过一个异步函数的内部抛没有catch块,或通过拒绝(),将其不与.catch处理一个承诺此错误。 (拒收ID:1)

我读过的一切,我能找到的承诺,回调,异步和等待,但我只是无法弄清楚如何将这些工作。

function slowServerLoop() {
    processWaitingList();
}
setInterval(slowServerLoop, 500);

async function processWaitingList() {
    let openVillage = await findOpenVillage();
    villageId = openVillage[0];
    openSpots = openVillage[1];
    addPlayerToVillage(waitingList[0], villageId, openSpots);
}

function findOpenVillage() {
    con.query(`SELECT id, maxVillagers FROM villages WHERE status='0'`, function (err, result, fields) {
        if (err) throw err;
        if (result.length === 1) {
            let villageId = result[0].id;
            let maxVillagers = result[0].maxVillagers;
            con.query(`SELECT COUNT(*) as villagerCount FROM villagers WHERE villageId='${villageId}'`, function (err, result, fields) {
                if (err) throw err;
                let villagerCount = result[0].villagerCount;
                let openSpots = maxVillagers - villagerCount;
                return [villageId, openSpots];
            });
        }
    });
}
回答如下:

有关于await重要的事情。如果你把它背后的一些承诺,将等承诺来解决,然后将值返回到您的代码。

在你的情况,你是不是回来的承诺,所以没有什么可期待的。

当你需要使用的承诺相结合的回调(异步/等待是刚刚超过承诺链延伸),方式之一是包装内的新承诺回调。

你的情况

return new Promise((resolve, reject) =>
{
con.query(`SELECT id, maxVillagers FROM villages WHERE status='0'`, function (err, result, fields) {
        if (err) reject(err);
        if (result.length === 1) {
            let villageId = result[0].id;
            let maxVillagers = result[0].maxVillagers;
            con.query(`SELECT COUNT(*) as villagerCount FROM villagers WHERE villageId='${villageId}'`, function (err, result, fields) {
                if (err) reject(err);
                let villagerCount = result[0].villagerCount;
                let openSpots = maxVillagers - villagerCount;
                resolve([villageId, openSpots]);
            });
        }
    });
}

还记得,你需要返回它(它已经在代码^^)

发布评论

评论列表(0)

  1. 暂无评论