开发者问题收集

使用 await 时,JavaScript 异步函数会引发错误

2022-01-14
886

在 JavaScript 方面,我还是新手。 在我的 vuejs3 应用中,我遇到以下情况(我认为了解这是 Vue 并不重要):

在我的 Vue 应用中,我有一个这样的方法

async LoadBasicData()
{
    this.basicData = await window.LoadBasicData();
},

它调用另一个 JavaScript 文件中的函数。该方法看起来有点像这样:

async function LoadBasicData()
{
    return new Promise(resolve =>
    {
        let result = Object.create(null);

        let url = 'MyFancyUrl';

        axios
            .get(url)
            .then((response) =>
            {
                result.data = response.data;

                result = await LoadBuildId(result);

                resolve(result);
            })
    });
}

LoadBuildId 函数看起来非常相似

async function LoadBuildId(result)
{
    return new Promise(resolve =>
    {
        let url = 'MySecondFancyUrl';

        axios
            .get(url)
            .then((response) =>
            {
                result.buildId = response.data;

                resolve(result);
            })
    });
}

从我对所有这些 async/await/promise 的理解来看,这应该是正确的做法,但考虑到它不起作用,我很确定我误解了一些东西 调用 LoadBuildId 时,我收到错误“await 仅在异步函数和模块的顶层主体中有效”。我不明白错误原因,因为 await 是在异步函数中调用的

我在这里做错了什么?为什么我的异步函数不能调用另一个异步函数?或者有更好的方法吗?

我知道至少有一种方法可以实现我需要的功能,那就是使用回调。到目前为止我一直在使用它,但我并不是很喜欢它,因为它确实使代码变得不必要地复杂。

1个回答

你犯了 2 个错误

代码可以大大简化:

async function LoadBuildId(result)
{
    let url = 'MySecondFancyUrl';
    const response = await axios.get(url)
    result.buildId = response.data;
    return result;
}

async function LoadBasicData()
{
    let url = 'MyFancyUrl';
    let result = Object.create(null);

    const response = await axios.get(url);
    result = await LoadBuildId(result);
    return result;
}

老实说,它可以进一步简化 - 无需构造 result 对象来设置其属性 - 你也可以只从调用中返回结果 axios.get

Jamiec
2022-01-14