【ES8系列】Async\Await

Async

ES6的 Promise 通过在函数内部实例化(new Promise())一个Promise 对象返回一个 Promise 实例达到异步操作的目的,函数返回值是一个 Promise 对象。也就是说,用这种方法外部函数是一个普通函数,内部函数返回一个Promise 实例。

 那么ES8的 Async 的作用则是不再需要手动返回一个 Promise,只需要在 声明function 前加 async,会在返回时自动检查返回值是否为 Promise 实例,如果不是则转换为一个Promise 实例。这样一来,在进行异步代码编程时不需要手动添加 new Promise() 实例,只需要正确返回值就可以,其它的交给引擎处理。

异步函数和普通函数对比,以及异步函数取值操作实例:

// 普通函数
function firstAsync() {
  return 27
}
console.log(firstAsync()) // 27


// 声明一个异步函数
async function firstAsync() {
  return 27
}
// 返回一个promise 对象
console.log(firstAsync()) // Promise {<resolved>: 27}

// 异步函数取值方法
// 声明一个异步函数
async function firstAsync() {
  return 27
}
firstAsync().then(val => {
  console.log(val);// 27
}) 

那么,Async 异步函数是如何取到返回值的?

异步函数会把返回值自动转换为一个 Promise 对象,转换后把数据传递给 Promise 的 静态方法 Promise.resolve() ,以上异步函数取值代码可以这么理解:

// 异步函数取值方法
// 声明一个异步函数
async function firstAsync() {
  return Promise.resolve(28) // 把返回值不是promise实例的值通过Promise.resolve()这个静态方法转换成一个Promise 实例
}
firstAsync().then(val => {
  console.log(val);// 28
})

// 判断 firstAsync的返回值是否是一个 Promise 实例
console.log(firstAsync() instanceof Promise) // true 

Async\Await

await 后必须是一个Promise对象,如果不是会自动转换成一个Promise对象,另外await 必须配合 Async 来用,不能在没有 Async 标注的函数体内使用 await。

// 异步函数
async function firstAsync() {
  // 异步函数内的异步操作:一秒后执行
  let promise = new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve('now it is done')
    }, 1000)
  })
  // let result = await promise
  // console.log(result)
  // await promise 是一个表达式,最终有一个结果,这个表达式的值就是promise返回的值
  // await 后必须是一个Promise对象,如果不是会自动转换成一个Promise对象
  // await 必须配合 Async 来用,不能在没有 Async 标注的函数体内使用 await
  console.log(await promise)
  console.log(await 30)
  console.log(await Promise.resolve(40))
  console.log(2)
  return 3
}
firstAsync().then(val => {
  console.log(val)
})

// now it is done
// 30
// 40
// 2
// 3

 Async\Await 本质上来讲是Promise的语法糖,只是比Promise使用方式更简洁、优雅。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章