async await | 异步回调处理代码阻塞问题

 在程序中,有的函数执行所消耗的时间会比较长,这时会造成代码阻塞,导致下面的代码无法及时执行。

这时就需要异步回调来解决

把耗时的函数放到“后台”执行,等到它执行完毕,以回调函数的方式返回处理后的结果。

下面举个例子:

// 构造一个延迟resolve的promise对象
let delayGet = value =>
  new Promise(resolve => setTimeout(() => resolve('resolve: ' + value), 1000))

// async把函数包装为Promise
// async内部await用于阻塞Promise
async function main() {
  console.time('main')

  console.log('pass0')

  // 获得promise
  let res1 = delayGet(1)
  let res2 = delayGet(2)

  console.log('pass1')

  // 等待promise.resolve
  console.log(await res1)
  console.log(await res2)

  console.log('pass2')

  console.log(await delayGet(1))
  console.log(await delayGet(2))

  console.log('pass3')

  console.timeEnd('main')

  return 200
}


console.log('start')
// 异步回调
main().then(res => console.log(res))

console.log('end')

猜猜输出结果会是怎么样的

 async await | 异步回调处理代码阻塞问题_第1张图片

如果把main函数的定义隐藏的话,就是这样。

main函数会花费3秒钟的时间

console.log('start')
// 异步回调
main().then(res => console.log(res))

console.log('end')

由于采用异步回调,所以不会阻塞下面的代码。

 

在函数前面加上async,这个函数就会变成一个promise对象,以函数返回值作为resolve的值。

async await | 异步回调处理代码阻塞问题_第2张图片

await是个比较特殊的特性,await是es7的关键字,只能在被async修饰的函数内使用。

它用来阻塞式获取promise对象的resolve值,若接受到resolve,则继续执行下面的代码。

下面方式1和方式2效果是一样的

async await | 异步回调处理代码阻塞问题_第3张图片

await也可说是用来替代then链式调用的。

可能经常遇到下面这样的代码

export const asyncFunc1 = async () => await new Promise(resolve => resolve(233))

export async function asyncFunc2(params) {
  return await new Promise(resolve => {
    /** do something **/
    resolve(params)
  })
}

 

你可能感兴趣的:(JavaScript)