💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Async ## 为什么使用async 相比于Generator,不断的调用next来输出状态不是那么的语义化。作为generator的语法糖,async的改进主要在于 1. Generator 函数的执行必须依靠执行器,而 Async() 函数自带执行器,调用方式跟普通函数的调用一样。 2. Async 和 await相较于 * 和 yield 更加语义化。 3. async 函数返回值是 Promise 对象,比 Generator函数返回的 Iterator 对象方便,可以直接使用 then方法进行调用。 ## 对比 ```javascript fn = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(1) }, 2000) }) } const Fn = () =>{ fn().then((res) => { console.log(res) }) } Fn() console.log(2) ``` 可以看出 结果应该是先输出2 两秒之后输出1 使用async/await改进后代码应该是 ```javascript fn = () => { return new Promise((resolve, reject) => { setTimeout((() => { resolve(1) }), 2000) }) } const Fn = async () => { await fn().then(res => { console.log(res) }) console.log(2) } Fn() console.log(2) ``` 这里的输出情况为2-1-2 ## await await 后面需要跟一个promise对象。如果不是promise,就会立即被转换为一个resolve状态的promise。 ```javascript async function f() { return await 123; } f().then(v => console.log(v)) // 123 ``` 如果返回的await中是一个reject的promise对象,那么返回值会在catch中获得。 ## 注意 最好在使用中,将await放到try...catch中以免出现错误影响后续await