Javascript 使用async/await的优点是什么?

Javascript 使用async/await的优点是什么?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我正在阅读几篇文章并观看一些关于如何在JavaScript中使用async/await的视频,似乎唯一的原因是在同步代码中转换异步代码(并使代码更具可读性,但本问题不打算讨论这一点) 因此,我想了解使用这些语句是否还有更多的原因,因为据我所知,如果我们承诺进行异步调用并提高代码的性能,为什么我们要再次将其转换为同步代码?我认为async Wait提高了代码的可读性。在一些promise回调使用中,您会发现自己处于一个非常长的链中,这可以称为回调坑。考虑是否使用异步等待。 它可以被认为实际上不是同

我正在阅读几篇文章并观看一些关于如何在JavaScript中使用async/await的视频,似乎唯一的原因是在同步代码中转换异步代码(并使代码更具可读性,但本问题不打算讨论这一点)


因此,我想了解使用这些语句是否还有更多的原因,因为据我所知,如果我们承诺进行异步调用并提高代码的性能,为什么我们要再次将其转换为同步代码?

我认为async Wait提高了代码的可读性。在一些promise回调使用中,您会发现自己处于一个非常长的链中,这可以称为回调坑。考虑是否使用异步等待。

它可以被认为实际上不是同步的。当您等待
异步的东西时,它会被添加到一个微任务队列中。它不会在主线程上运行,这意味着可能会发生其他事情(单击事件、渲染等)

下面是一个精彩的演讲,可以更详细地解释它


await/async
通常被称为语法糖,让我们等待一些东西(例如API调用),这给我们一种同步的错觉。

有时您需要在单个函数中执行多个操作,其中一些可能是异步的,而另一些可能是同步的。假设您有以下带有承诺的代码

getUser().then(user => {
    getOrders({
        user: user
    }).then(orders => {
        console.log(orders)
    })
})
现在,如果您希望仅在条件为真时获取订单,但让进一步的代码按原样运行,那么如果您使用的是承诺,那么您必须创建一个单独的函数,然后像这样调用该函数

function logOrders(orders) {
    console.log(orders)
}


getUser().then(user => {
    if (user.hasOrders) {
        getOrders({
            user: user
        }).then(logOrders)
    } else {
        logOrders([])
    }
})
(async () => {

    const user = await getUser();
    let orders = [];

    if (user.hasOrders) {
        orders = await getOrders({
            user: user
        })
    }

    console.log(orders)

})()
但是使用async/await可以这样做

function logOrders(orders) {
    console.log(orders)
}


getUser().then(user => {
    if (user.hasOrders) {
        getOrders({
            user: user
        }).then(logOrders)
    } else {
        logOrders([])
    }
})
(async () => {

    const user = await getUser();
    let orders = [];

    if (user.hasOrders) {
        orders = await getOrders({
            user: user
        })
    }

    console.log(orders)

})()

我相信这只是语法上的糖。承诺真的很难完全理解,许多人从来没有真正做到完全正确,好的嵌套回调不能很好地扩展。它不是同步代码。它是按顺序异步运行但仍遵循控制结构的代码。不多不少。你认为为什么承诺会提高绩效?它们只会简化异步结果的处理。@jaloplo
let count=0;函数done(){console.log(“callback”,count);if(++count==2)console.log(“均已完成”);}setTimeout(done,1000);设置超时(完成,1500)-两个超时同时发生。或者使用async.js库来完成这些事情。@jaloplo不,这两个超时同时发生-你自己试试。times不添加“都已完成”日志,因为这两个日志都调用了回调。这不是什么把戏,它与
Promise完全相同。all
在内部使用以等待多个异步Promise解析。不,。您将如何做到这一点?您必须有条件地等待getOrders()完成ID检查链接?另外,
getUser().then(user=>user.hasOrders?getOrders({user}):[])。then(orders=>console.log(orders))如何访问last then方法中的用户变量?视频不可用,或者至少对我来说是这样。非常好和有用的视频,解释了javascript的基本知识,谢谢!!!