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使用方式更简洁、优雅。