async和await
作者:互联网
async
内置执行器:Generator 函数的执行必须依靠执行器,而 async 函数自带执行器,调用方式跟普通函数的调用一样更好的语义:async 和 await 相较于 * 和 yield 更加语义化
更广的适用性:co 模块约定,yield 命令后面只能是 Thunk 函数或 Promise对象。而 async 函数的 await 命令后面则可以是 Promise 或者 原始类型的值(Number,string,boolean,但这时等同于同步操作)
返回值是 Promise:async 函数返回值是 Promise 对象,比 Generator 函数返回的 Iterator 对象方便,可以直接使用 then() 方法进行调用
await
await
后面接一个会 return new promise
的函数并执行它
await
只能放在 async
函数里
一些例子:(加强理解)
- 不是promise对象
如果不是 promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的对象,作为 await表达式的结果。
async function async1() { await async2(); // 先执行async2(),await下面所有的代码都是异步 console.log(1); // 异步 } async function async2() { console.log(2); } console.log(3); async1(); // 3 // 2 // 1
- 是promise对象
如果是 promise 对象,await 也会阻塞async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。
function fn() { return new Promise(resolve => { console.log(1); // 同步2 resolve(); }) } async function async1() { await fn().then(() => { // 先执行fn(),await下面所有的代码都是异步 console.log(2); // 异步1 }) console.log(3); // 异步1的下一个异步 } console.log(4); // 同步1 async1(); // 4 // 1 // 2 // 3
如果asycn里的代码都是同步的,那么这个函数被调用就会同步执行
async function fn(){ console.log('a'); // 同步1 } fn(); console.log('b'); // 同步2 //a //b
async function async1() { console.log(1); // 同步2 await async2(); // 先执行async2() 再await console.log(2); // 异步(await下面所有的代码都是异步) } async function async2() { console.log(3); // 同步3 } console.log(4); // 同步1 async1(); console.log(5); // 同步4 // 4 // 1 // 3 // 5 // 2
async function async1() { console.log(1); await async2(); console.log(2); await async3(); console.log(3); } async function async2() { return new Promise((resolve) => { console.log(4); resolve(); // 如果没有resolve(),await async2()后的代码都不会执行,只输出6 1 4 7 }) } async function async3() { console.log(5); } console.log(6); async1(); console.log(7); // 6 // 1 // 4 // 7 // 2 // 5 // 3
2021-12-27 17:28:58
标签:function,async2,console,log,await,async 来源: https://www.cnblogs.com/zhenggc99/p/15737116.html