1. 语法:

async function 异步函数(){
	//代码 
	let promise = 其他异步函数()
	// 代码
	let result = await promise
	/*此时result就不是Promise对象了,已经是返回的数据了*/
	//处理result
	return result;
}
/* 等同于以下代码: */
function 异步函数(){
	return new Promise(resolve=>{//对应async语句
		其他异步函数().then(result=>{//对应await语句
			 resolve(result)//对应return语句
		})
	})
}

1. 说明:

  1. await只能在异步函数中使用
  2. async 异步函数相当于new Promise(异步函数)
    1. 所以异步函数().then().catch()也是可用的
  3. 而对于async函数中的return 值语句, 就相当该语句:resolve(值)
    1. 默认异步函数执行完就会改变状态为成功
    2. 而不能像Promise对象中调用resolve那么灵活
  4. 当await的promise转变为rejected状态时,程序会抛出异常
    1. 相当于throw error

2. 注意:

1. 迭代await

  1. 如果在forEach()和map()的回调函数中去循环执行其他异步函数(即使回调函数使用了async关键字)
    1. 则await关键字会失效
    2. 需要使用不带回调函数的for循环, 如普通的for或者for of

1.1. 实例:

function sleep(ms: number) {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('') }, ms)
    })
}
(async function main() {
    // 传统for语句可以迭代await
    for (let i = 1; i < 3; i++) {
        await sleep(1000)
        console.log(i)
    }
    //for of 也可以迭代await
    for (const i of [1, 2]) {
        await sleep(1000)
        console.log(i)
    }
    //forEach 不能迭代await
    [1, 2].forEach(async (i) => {
        await sleep(1000)
        console.log(i)
    })
})()