Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点JS中的异步/等待失败_Node.js - Fatal编程技术网

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

Node.js 节点JS中的异步/等待失败,node.js,Node.js,在尝试处理MSSQL查询时,我遇到了一些异步/等待问题。 查询工作正常,因为如果我这样做 console.log(sqltest.getNextId("A")) 我得到了预期的结果。但我需要等待第一个查询的结果传递到第二个查询,所以我在下面进行了尝试。我是不是错过了什么?我想保持它尽可能干净,因为我可能需要按顺序执行多于2个 async function someMethod() { var newId = await sqltest.getNextId("A") var nextId =

在尝试处理MSSQL查询时,我遇到了一些异步/等待问题。 查询工作正常,因为如果我这样做

console.log(sqltest.getNextId("A"))
我得到了预期的结果。但我需要等待第一个查询的结果传递到第二个查询,所以我在下面进行了尝试。我是不是错过了什么?我想保持它尽可能干净,因为我可能需要按顺序执行多于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)
            })

}
好的,这里是我的.stored过程代码,可以消除所有的混淆

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

没有秘密错误,它只是返回undefined-console.log的undefined

这个评论其实是很重要的一点

getNextId
实际上不会返回任何内容,也不会返回您正在寻找的值,也不会返回您可以等待的承诺。您看到输出的原因是
getNextId
然后
回调中运行
控制台.log

但是
console.log(sqltest.getNextId(“A”)
可能会抛出一个
未定义的

由于
sqlUtil.storedProcedure
似乎返回了一个承诺(因为您对其调用了
then()
,所以您可以知道,您应该能够将其转换为异步函数,并在该函数上执行
wait

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
,解析为
newCounter
,如果记录
sqltest.getNextId(“a”),则可以使用
wait

调用它
向您显示了预期的结果(而不是一个
承诺
),那么我认为这根本不是一个
aync
方法。您收到了什么错误消息?控制台上记录了什么?sqltest.getNextId(“a”)到底是什么
return?它返回值吗?承诺吗?它是异步的吗?是否有
getNextId()的API文档
或者如果它是您的函数,您可以向我们展示用于该函数的代码吗?
updateId()的相同问题
。我们可以查看代码或文档吗?Wait在您等待承诺时会做一些有用的事情。它在几乎任何其他情况下都不会做任何有用的事情。您仍然没有显示您收到的错误消息,或者显示正在发生的情况,而不是您预期的情况。您遇到的问题是什么?没有秘密错误st返回undefined-控制台的undefined.logYes将我的函数转换为异步函数使其工作正常