首先要说明的是async和await的用法都是promise的语法糖,更确切的说:async 函数就是 Generator 函数的语法糖。await必须在async函数中使用,但是async函数的调用不一定需要await关键字,且async函数中不一定有await。
async和await同时使用时,完成的操作是:async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。
- async
将函数的返回结果用Promise.resolve()包裹起来,如果async函数有返回值result,则该async函数的返回结果为Promise.resolve(result), 如果async函数没有明确的返回值,则该async函数的返回结果为Promise.resolve(undefined),async函数的结果应该用then链来进行处理。
async函数中没有await关键字时,会直接返回promise对象,不会阻塞后面的语句。
async function foo1(params) {
return params
}
async function foo2(params) {
console.log('params-->', params)
}
let f1 = foo1(1)
let f2 = foo2(1)
得到的f1和f2的结果如下图:
2. await
await一般用来等待promise对象,但是要注意的是:await不是一定要用来等待promise对象,实际上它可以用来等待任意表达式的结果。
只是如果它等待的是一个promise对象的话,会阻塞后面的语句,直到promise的resolve,且await的返回结果是就是resolve的结果(即Promise.resolve(data)的data);但是如果是一般表达式的话,就不会造成阻塞,且返回的结果就是表达式的结果。
function foo1() {
return 'hello'
}
async function foo2() {
return Promise.resolve('world')
}
async function foo3() {
let f1 = await foo1()
let f2 = await foo2()
console.log(f1, f2)
}
foo3() //打印出的结果是"hello world"
总的来说,async和await是用于对promise进行简写,且使其看起来更像同步的一种写法。
参考:
理解 JavaScript 的 async/await
async 函数的含义和用法