异步等待承诺待定

时间:2019-08-01 22:28:28

标签: javascript node.js

我正在尝试创建一个函数,该函数根据搜索条件从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'))

这给了我

  

承诺{待处理}

     

[RowDataPacket {值:101}]

我想要[ RowDataPacket { value: 101 } ]表示承诺未完成的结果。

我也尝试过:

async function test(){
    console.log(await getNextNumber('QC'))
}

这没有结果

1 个答案:

答案 0 :(得分:2)

我看到一些编码错误:

  1. 只有您的第一个声明let newCounter前面应该有let。然后为newCounter分配一个值时,请删除let。那就是创建一个新的局部范围的变量(给局部块),为它分配一个值,然后它超出范围,并且顶级newCounter永远不会得到值。

  2. 分配是通过=完成的,而不是通过==完成的,除非您希望变量中的所有内容都是布尔值。因此,将let newCounter == await pool.query(...)更改为newCounter == await pool.query(...)

  3. 所有async函数都返回一个诺言,并且您必须通过调用.then()对返回的诺言使用awaitgetNextNumber()。因此,一旦您解决了其他编码错误,就可以尝试使用console.log(await getNextNumber('QC'))进行第二次尝试。

然后,再检查一件事。

您是否100%确定您的数据库版本正在返回pool.query()的承诺? await仅在您正在等待的值是一个承诺并且不包含使其他类型的异步操作实际上等待并返回值的魔术时才有用。 await需要与诺言一起使用。


将其放在一起(并假设您使用的是正确的pool.query()接口,它会返回一个承诺:

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);
});