关于ES7中的Async
-
概念
-
真正意义上去解决异步回调的问题,同步流程表达异步操作
描述
-
异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。
本质
-
Generator的语法糖
语法
-
结构
asycn function name([param[, param[, ... param]]]) { [return_value] = await expression; //await 异步操作; }
参数
-
name:函数名
-
param:形参,要传递给函数的参数
-
expression:等待一个函数或表达式(通常情况下是一个返回Promise 对象的函数)
-
return_value:如果 await 操作符后的表达式的值不是一个 Promise,
则返回该值本身 -
asycn 函数返回值:返回的总是Promise对象(如果返回的不是一个promise,JavaScript也会自动把这个值"包装"成Promise的resolve值)
语法规定:await命令只能出现在 async 函数内部,否则会报错。
特点
-
- 不需要像Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行
-
- 返回的总是Promise对象,可以用then方法进行下一步操作
-
- async取代Generator函数的星号*,await取代Generator的yield
-
- 语意上更为明确,使用简单,暂时没有不良反应
举例
-
函数前面使用了async关键字,返回一个promise对象。
async function aFun() { //expression 通常情况下是一个返回Promise 对象的函数foo() return await foo(); } console.log(aFun()); //Promise {<pending>}
-
如果返回的不是一个promise,JavaScript也会自动把这个值"包装"成Promise的resolve值。
async function test() { return "Hello async"; } //返回的是Promise对象 console.log(test()); // Promise {<resolved>: "Hello async"} //在最外层不能用 await 获取其返回值的情况下 ///可以用then() 链来处理这个 Promise 对象 test().then((v=>console.log(v))); //"Hello async"
await 等待一个函数或表达式
async function test1() { let str=await "Hello async"; console.log(str); //str="hello async" //得到的是一个字符串,不是Promise 一个对象 } console.log(test1()); //Promise {<pending>} //test1() 返回的是一个Promise对象
关于await
-
await的执行顺序为从右到左,会阻塞后面的代码执行,但并不是直接阻塞await的表达式。
-
当await 等到的:
-
- 不是一个 promise 对象,await会阻塞后面的代码,会先执行async外面的同步代码(外面的同步代码await执行完后,会让出线程),等外面的同步代码执行完成在执行async中的代码。
-
- 一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码外面的同步代码await执行完后,会让出线程,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为await 表达式的运算结果。
async function test() { return "Hello async"; } test().then(<