我正在尝试创建一个函数,该函数根据搜索条件添加并返回 mysql 表行中的下一个最高值。我的函数如下所示:
async function getNextNumber(systemType){
let newCounter
try{
if(systemType == 'POS'){
await pool.query(`Update counters set value = value + 1 where type = 'POS'`)
let newCounter == await pool.query(`Select value from counters where type = 'POS'`)
console.log(newCounter)
}
if(systemType == 'ST'){
await pool.query(`Update counters set value = value + 1 where type = 'ST'`)
let newCounter = await pool.query(`Select value from counters where type = 'ST'`)
}
return newCounter
}
catch(err){
console.log(err)
}
}
console.log(getNextNumber('POS'))
这给了我:
Promise { pending}
[ RowDataPacket { value: 101 } ]
我想要 [ RowDataPacket { value: 101 } ]
结果,其中显示 promise 待处理。
我也尝试过:
async function test(){
console.log(await getNextNumber('QC'))
}
这没有给我结果
最佳答案
我看到几个编码错误:
只有第一个
<let newCounter
声明的前面才应该有let
。当您为newCounter
分配值时,删除let
。那就是创建一个新的本地范围(到本地 block )变量,为其分配一个值,然后它超出范围,并且顶级newCounter
永远不会获取值。赋值是用
<=
完成的,而不是用==
完成的,除非你想要的变量只是一个 bool 值。因此,将let newCounter == wait pool.query(...)
更改为newCounter == wait pool.query(...)
。所有
async
函数都会返回一个promise,并且您必须对调用返回的promise使用.then()
或await
getNextNumber()
。因此,一旦修复了其他编码错误,您第二次尝试console.log(await getNextNumber('QC'))
应该会起作用。
然后,还有一件事需要检查。
您是否 100% 确定您的数据库版本正在从 pool.query()
返回 promise ? await
仅当您正在等待的值是一个 promise 并且它不包含使其他类型的异步操作实际等待并返回值的魔法时,才会做一些有用的事情。 await
需要与 Promise 一起使用。
将它们放在一起(并假设您使用返回 promise 的正确 pool.query()
接口(interface):
async function getNextNumber(systemType) {
let newCounter;
try {
if (systemType == 'POS') {
await pool.query(`Update counters set value = value + 1 where type = 'POS'`);
newCounter = await pool.query(`Select value from counters where type = 'POS'`);
console.log(newCounter);
} else if (systemType == 'ST') {
await pool.query(`Update counters set value = value + 1 where type = 'ST'`);
newCounter = await pool.query(`Select value from counters where type = 'ST'`);
} else {
// probably need some other return value or error handling here
throw new Error("invalid systemType in getNextNumber()")
}
return newCounter;
} catch (err) {
console.log(err)
throw err; // need to propagate the error
}
}
console.log(await getNextNumber('POS'));
// or with error handling
getNextNumber('POS').then(val => {
console.log(val);
}).catch(err => {
console.log(err);
});
关于javascript - 异步等待 promise 待处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57317736/