Axios GET 响应数据正确,但 Promise Pending to 变量 [duplicate]

Axios GET response data correct, but Promise Pending to variable [duplicate]

提问人:squatman 提问时间:11/14/2023 最后编辑:squatman 更新时间:11/14/2023 访问量:31

问:

我有一个正在运行的后端服务器,该服务器在 Axios GET 请求之后从数据库请求数据。

app.get('/calendars', (req, res) => {
    //query database for userlist
    sql.connect(config, err => {
        // ... error checks
        console.log("err1-" + err)
        // Query
        new sql.Request().query('SELECT full_name AS "id", full_name AS "label", CAST(0 AS BIT) AS "readonly", CAST(1 AS BIT) AS "active" FROM [User];', (err, result) => {
            // ... error checks
            console.dir(result.recordset)
            res.status(200).json(result.recordset)
        })
    })
})

我的前端 GET 请求正确地注销了 response.data,但是当我在分配给变量后尝试记录返回的 response.data 时,我得到了一个 Promise 待处理。我在网上看过,我肯定有一个“等待”,我尝试过一个 .then,但得到相同的结果。

async function getCalendars() {
    try {
      const response = await axios.get('http://localhost:3000/calendars');
      console.log(response.data)
       return response.data
    } catch (error) {
      console.error(error);
    }
  }

var defaultCalendars = getCalendars()
console.log(defaultCalendars);

Console Output

任何帮助将不胜感激。

提前致谢


@evolutionbox评论后提供更多信息。

async function getCalendars() {
    try {
      return await axios.get('http://localhost:3000/calendars');
    } catch (error) {
      console.error(error);
    }
  }

const defaultCalendars = getCalendars().then(result => console.log(result))

console.log(defaultCalendars);

与最初一样,第 107 行 - console.log(result) 显示数据,但第 109 行 - console.log(defaultCalendars) 再次是 Promise {}。

console output 2


在异步函数中添加了 await getCalendars()。

var defaultCalendars;

async function run() {
    defaultCalendars = await getCalendars()
}

async function getCalendars() {
    try {
      return await axios.get('http://localhost:3000/calendars');
    } catch (error) {
      console.error(error);
    }
  }

run();

console.log(defaultCalendars);
JavaScript 节点 .js json sql-server

评论

0赞 evolutionxbox 11/14/2023
您需要等待或使用例如.getCalendars().thengetCalendars().then(result => console.log(result))
0赞 squatman 11/14/2023
@evolutionxbox感谢您的回复,也是对下面建议的答案的回应,以这种方式使用 await 给了我“未捕获的语法错误:await 仅在异步函数和模块的顶级主体中有效”。请参阅对原始问题的编辑,显示添加 .then => 的结果。
0赞 evolutionxbox 11/14/2023
这是因为 await 是一个保留字,只在异步函数中起作用。把它放在一个异步函数中,使用 await,或者使用.then
0赞 squatman 11/14/2023
再次@evolutionxbox感谢。我已经修改了我的问题,以显示在异步函数中添加了 await 的代码。控制台现在读取 console.log(defaultCalendars) 的 undefined。我之前的修改显示了 .then 的使用和我收到的结果。
0赞 evolutionxbox 11/14/2023
请阅读其他链接的文章?您无法访问这样的异步值。它们只能在异步函数或回调中等待一次才能访问。看到这个问题.then

答:

-1赞 Λrѕlαɴ Iꜰᴛɪᴋʜᴀʀ 11/14/2023 #1

如果您将 await 与变量一起使用,它将起作用。

const response = await axios.get('http://localhost:3000/calendars');
const data= await response.data;
console.log(data)

评论

0赞 squatman 11/14/2023
您好,感谢您的回复。如果我像这样使用 await,我会收到以下错误“Uncaught SyntaxError: await is valid only in async functions and the top level body of modules”。我的示例代码是直接用 calendar.js 编写的,而不是在任何方法中编写的。