YanTianFeng的知识库

Want Coding

Want Reading

文章 89

访问 18444

评论 2

头像

YanTianFeng

发私信

文章 89
访问 18444
评论 2
Technology and Code
返回顶部

Knowledge  async/await总结

标签   async   await  

  ( 13 )       ( 0 )


async / await 总结

说明

一句话解释: async 函数,就是 Generator 函数的语法糖

1. 建立在 promise 之上。所以,不能把它和回调函数搭配使用。但它会声明一个异步函数,并隐式地返回一个 Promise 。因此可以直接 return 变量,无需使用 Promise.resolve 进行转换

2. 和 promise 一样,是非阻塞的。但不用写 then 及其回调函数,这减少代码行数,也避免了代码嵌套。而且,所有异步调用,可以写在同一个代码块中,无需定义多余的中间变量

3. 它的最大价值在于,可以使异步代码,在形式上,更接近于同步代码

4. 它总是与 await 一起使用的。并且, await 只能在 async 函数体内

5.await 是个运算符,用于组成表达式,它会阻塞后面的代码。如果等到的是 Promise 对象,则得到其 resolve 值。否则,会得到一个表达式的运算结果

一个简单的例子

const doSomethingAsync = () => {
    return new Promise((resolve) => {
        setTimeout(() => resolve('I did something'), 3000)
    })
}
 
const doSomething = async () => {
    console.log(await doSomethingAsync())
}
 
console.log('Before')
doSomething()
console.log('After')

一切都是 promise

将 async 关键字添加到任何函数,意味着该函数将返回一个 Promise

const aFunction = async () => {
  return 'test'
}
aFunction().then(alert) // This will alert 'test'

并且与下面的代码等价:

const aFunction = async () => {
  return Promise.resolve('test')
}
aFunction().then(alert) // This will alert 'test'

代码更易于阅读

每一个步骤都需要之前每个步骤的结果

const getFirstUserData = () => {
  return fetch('/users.json') // get users list
    .then(response => response.json()) // parse JSON
    .then(users => users[0]) // pick first user
    .then(user => fetch(`/users/${user.name}`)) // get user data
    .then(userResponse => response.json()) // parse JSON
}
getFirstUserData()

并且与下面的代码等价:

const getFirstUserData = async () => {
  const response = await fetch('/users.json') // get users list
  const users = await response.json() // parse JSON
  const user = users[0] // pick first user
  const userResponse = await fetch(`/users/${user.name}`) // get user data
  const userData = await user.json() // parse JSON
  return userData
}
getFirstUserData()

async / await 中的错误处理

async 中的错误处理

因为 async 的返回值也是个 promise ,跟 promise 的错误处理差不多。此外, async 里面 throw Error 相当于返回 Promise.reject

async function F(){
  throw new Error('test1')
}
var f=F();
f.catch(function(e){console.log(e)});
// Error:test1

await 中的错误处理

在 async 中, await 的错误相当于 Promise.reject

async function F(){
  await Promise.reject('Error test1').catch(function(e){
     console.log(e)
  })
}
var f=F(); // Error:test1

await 中的 promise.reject 必须要被捕获

await 如果返回的是 reject 状态的 promise ,如果不被捕获,就会中断 async 函数的执行

async function F(){
  await Promise.reject('Error test1');
  await 2
}
var f=F()

上述代码中,前面的 Promise.reject 没有被捕获,所以不会执行 await 2