async,awaite与promise的区别

什么是Async/Await?

async/await是写异步代码的新方式,以前的方法有回调函数和Promise。
async/await是基于Promise实现的,它不能用于普通的回调函数。
async/await使得异步代码看起来像同步代码。

//使用promise
 const makeRequest = () =>
        getJSON().then(data => {
            console.log(data)
            return "done"
        })
//使用async,await
 const makeRequest = async () => {
        // await getJSON()表示console.log会等到getJSON的promise成功reosolve之后再执行。
        console.log(await getJSON)
        return "done"
    }

区别:

函数前面多了一个aync关键字。await关键字只能用在aync定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值。

Async/Await相比于promise的优势:

1)使用async函数可以让代码简洁很多,不需要像Promise一样需要些then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。

2) 错误处理:Async/Await 让 try/catch 可以同时处理同步和异步错误。如果它在Promise中。我们需要使用 .catch。

   const makeRequest = async () => {
        try {
            // this parse may fail
            const data = JSON.parse(await getJSON())
            console.log(data)
        } catch (err) {
            console.log(err)
        }
    }

你很可能遇到过这样的场景,调用promise1,使用promise1返回的结果去调用promise2,然后使用promise2结果去调用promise3。

//promise.then方式
const makeRequest = () => {
        return promise1().then(value1 => {
            return promise2(value1).then(value2 => {
                return promise3( value2)
            })
        })
}
//async,await方式
const makeRequest = async () => {
        const value1 = await promise1()
        const value2 = await promise2(value1)
        return promise3(value2)
}

promise.then.then链式写法太麻烦,代码可读性也差,如果用async,await方式就不一样,代码看起来像同步的一样,可能你还会想到用promise.all([])方法,这样确实简单,但如果题目改成使用promise1,promise2结果去调用promise3,promise.all([])方法就为了可读性牺牲了语义,所以最好还是使用async,await方式。

上一篇:C#在子线程Thread中使用await会出问题


下一篇:FastAPI 学习之路(五十五)操作Redis