节点JS中的异步/等待失败

时间:2018-10-26 21:20:38

标签: node.js

尝试处理我的MSSQL查询时,我在Async / Await中遇到一些问题。 该查询工作正常,因为如果我这样做

console.log(sqltest.getNextId("A"))

我得到了预期的结果。但是我需要等待第一个查询的结果传递给第二个,所以我在下面尝试了。我在这里想念什么吗?我想保持它尽可能干净,因为我可能需要在Sequence中执行大于2的操作。

async function someMethod() {
var newId = await sqltest.getNextId("A")

var nextId = await sqltest.updateId("A",newId)
console.log(newId + ' - ' + nextId)

}

someMethod() 

这是我的getNextId的样子

const getNextId = (counter_id) =>

    {const params = [{ name: "p_counter_id", type: sql.VarChar(10), value: counter_id }]
    sqlUtil
    .storedProcedure(params, "sp_counter_sel")
    .then(result => 
        {
        var newCounter = sequence
            (
            result.recordset[0].next_id,
            result.recordset[0].counter_length,
            result.recordset[0].counter_fill
            )

            console.log(newCounter)
            return newCounter
        }
        )
        .catch(err => {
            console.log('Error: ' + err.message)
            })

}

好的,消除所有混乱,这是我的.storedProcedure代码

let storedProcedure = async (params, storedProcedureName) => {
const pool = await getOrCreatePool()
let request = await pool.request()
params.forEach((parameter) => {
    parameterDirection = parameter.isOutput ? 'output' : 'input';
    request = request[parameterDirection](parameter.name, parameter.type, parameter.value)
})
try {
    return await request.execute(storedProcedureName)
    sql.on('error', err => {
    })

}  catch(err) {
    let message = {
        message: {
                msg: err.message,
                number: err.number
            },

    }
    throw message;
}
}

1 个答案:

答案 0 :(得分:2)

  

没有人为错误,它只会返回undefined-console.log未定义

此评论实际上是重要的一点!

getNextId实际上不会返回任何内容,不是您要查找的值,也不是您可以await的承诺。您看到输出的原因是getNextIdconsole.log回调中运行then

但是console.log(sqltest.getNextId("A"))可能会吐出undefined

由于sqlUtil.storedProcedure似乎返回了一个承诺(您可以说是因为您在其上调用了then(),因此您应该能够将其转换为异步函数,并在其上转换await

const getNextId = async (counter_id) => {
    const params = [{
        name: "p_counter_id",
        type: sql.VarChar(10),
        value: counter_id
    }]

    const result = await sqlUtil.storedProcedure(params, "sp_counter_sel")

    var newCounter = sequence(
        result.recordset[0].next_id,
        result.recordset[0].counter_length,
        result.recordset[0].counter_fill
    )

    return newCounter
}

console.log(await getNextId("A")); // Should be what you expect.

此函数现在有一个返回值。因为它现在是async,并且具有一个return语句,该语句未嵌套在另一个函数中。现在,它返回一个解析为Promise的{​​{1}},可以用newCounter来调用。

相关问题