定义
- Async/Await可以让接口按顺序异步获取数据,用更可读,可维护的方式处理回调
- 建立在Promises上,并且与所有现有的基于Promise的API兼容,async/await 其实是 Generator 的语法糖,它能实现的效果都能用then链来实现,它是为优化 then 链而开发出来的。从字面上来看, async 是“异步”的简写,await 则为等待,所以很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。当然语法上强制规定 await 只能出现在 asnyc 函数中
使用
- async函数返回了一个Promise对象,如果在函数中直接return一个直接量,async会把这个直接量通过Promise.resolve()封装成一个Promise对象
- async 函数返回的是一个 Promise 对象,所以在最外层不能用await 获取其返回值的情况下,当然应该用原来的方式:then() 链来处理这个 Promise 对象
- 如果 async 函数没有返回值,它会返回Promise.resolve(undefined)
- 在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致
- Async—声明一个异步函数(async function someName(){...})
- 自动将常规函数转换成Promise,返回值也是一个Promise对象
- 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
- 异步函数内部可以使用await
- Await—暂停异步的功能执行(var result = await someAsyncCall();)
- 放置在Promise调用之前,await强制其他代码等待,直到Promise完成并返回结果
- 只能与Promise一起使用,不适用于回调
- 只能在async函数内部使用
- 使用小贴士:async函数完全可以看作多个异步操作,包装成的一个 Promise对象,而await命令就是内部then命令的语法糖
//函数声明
async function foo(){
//do something
}
//函数表达式
const foo = async function(){
//do something
}
// 对象方法
let o = {
async foo(){
//do something
}
}
o.foo().then(()=> console.log('do something reslove'))
// 箭头函数
const foo = async () => {
// do something
}
//Class 使用
class Store {
constructor() {
this.cache = caches.open('msg')
}
async getMsg(msg) {
const cache = await this.cache
return cache
}
}
fn2().then(r => {
console.log(r) // 1
})
- await是async wait的缩写,它等待返回的是一个表达式,不管是不是promise对象都可以,只是说如果返回的是promise对象执行的状态不一样而已,需要注意的是await只能在async函数中使用
function sync() {
setTimeout(() => {
return 1
}, 1000)
}
async function async1(){
return new Promise(resolve => {
setTimeout(() => {
resolve(1)
}, 2000)
})
}
async function test(){
await sync() //undefined
console.log(1)
}
async function test2() {
await async1()
console.log(1)
}
test()
test2()
- await的用法则相对简单了许多,他后面需要是一个Promise对象,如果不是则会被转成Promise对象。只要其中一个如果Promise对象变为reject状态,那么整个async函数都会中断操作。如果状态是resolve,那么他的返回值则会变成then里面的参数
------------------------------------------------------------------------------2024.5.16 每日一题