gpt4 book ai didi

node.js - 如何使异步等待为调用数据库的函数工作

转载 作者:搜寻专家 更新时间:2023-11-01 00:49:23 24 4
gpt4 key购买 nike

我有一个异步函数 processWaitingList() 需要等待另一个函数 findOpenVillage() 从我的数据库中获取数据的结果。

我收到以下错误,但不明白原因:

(node:2620) UnhandledPromiseRejectionWarning: TypeError: Cannot read property '0' of undefined at processWaitingList (xx\server.js:151:36) at process._tickCallback (internal/process/next_tick.js:68:7) (node:2620) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

我已经阅读了我能找到的关于 promises、回调、async 和 await 的所有内容,但我就是无法弄清楚它们是如何工作的。

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 有一点很重要。如果您将其置于某些 promise 之后,它将等待 promise 得到解决,然后将值返回给您的代码。

在您的情况下,您没有返回 promise ,因此没有什么可等待的。

当您需要将 promise 与回调结合使用时(async/await 只是对 promise 链的扩展),一种方法是将回调包装在新的 promise 中。

在你的情况下

return new Promise((resolve, reject) =>
{
con.query(`SELECT id, maxVillagers FROM villages WHERE status='0'`, function (err, result, fields) {
if (err) { return 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) { return reject(err); }
let villagerCount = result[0].villagerCount;
let openSpots = maxVillagers - villagerCount;
resolve([villageId, openSpots]);
});
}
});
}

还请记住,您需要归还它(它已经在代码中 ^^ )

关于node.js - 如何使异步等待为调用数据库的函数工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com