JS async & await & 串行并行

Posted 凯特霖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS async & await & 串行并行相关的知识,希望对你有一定的参考价值。

含义

async

  1. async函数返回一个 Promise 对象
  2. async函数是 Generator 函数的语法糖
  3. async函数内部return语句返回的值,会成为then方法回调函数的参数。
  4. async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

await

  1. await只能作用在async修饰的方法中
  2. await命令后面是一个 Promise 对象,返回该对象成功的结果。如果不是 Promise 对象,就直接返回对应的值。
  3. await命令后面的 Promise 对象如果变为reject状态,则会被catch方法的回调函数接收到。
  4. await是会阻塞代码执行

await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try…catch代码块中。


使用

var timer1 = () => new Promise((resolve, reject) => {
        setTimeout(()=>{
			console.log('2秒后...')
			reject('2秒已过,报错') 
        },2000)
    })

var fn = async () => {
    const a = 123  
    await timer1()    // await阻塞代码执行,2秒后再直接进行报错捕获
    console.log('again')   // 不执行
}
fn().then(res=>{
     console.log(res);    
 }).catch(err=>{  // 在return 前面有报错,catch捕获
     console.log(err);  // 捕获reject --> 2秒已过,报错
 })

串行 & 并行


    var timer2 = () => new Promise((resolve, reject) => {
        setTimeout(()=>{
			console.log(2)
            resolve(2)
        },2000)
    })
    var timer3 = () => new Promise((resolve, reject) => {
        setTimeout(()=>{
			console.log(3)
            resolve(3)
        },3000)
    })

// 串行
async function f() {
	var num3 = await timer3()  // 先走3秒
	console.log('3秒走完中途执行log',111)   // 阻塞代码执行了,先走完3秒,再log  111
	var num2 = await timer2() // 再走2秒
	return  num3 + num2 // 总 5秒后return  3 + 2
}
f().then(res=>console.log(res))  // 5

// 并行 (可提高代码加载性能)
// 也可以使用Promise.all() 方法,效果更佳
async function f() {
	var num2 = timer2() // 提前执行
	var num3 = timer3() // 提前执行
	await num2  // 先走2秒
	await num3  // 再走了1秒
	return  num2 + num3  // 总3秒 
}
f().then(res=>console.log(res))  // 3秒后return 5

以上是关于JS async & await & 串行并行的主要内容,如果未能解决你的问题,请参考以下文章

async&await异步请求处理办法

网易云音乐数据交互—async&await实现版(完结篇)

async&await的前世今生

Angular 1.5 && Async/Await && 茉莉花测试

async & await

多线程async&await