宏任务和微任务在前端面试中,被经常提及到,包括口头和笔试题
/** * async 函数是使用async关键字声明的函数。 * async 函数是AsyncFunction构造函数的实例, 并且其中允许使用await关键字。 * async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。 * * await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。 * await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理 (fulfilled),其回调的 resolve 函数参数作为 await 表达式的值,继续执行 * async function。 * 若 Promise 处理异常 (rejected),await 表达式会把 Promise 的异常原因抛出。 * 另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。 * * * */ // 模拟请求接口 function userInfo() { return new Promise((resolve) => { setTimeout(() => { resolve("zhangsan"); }, 2000); }); } // 接收请求的返回值 async function fetchUserInfo() { let res = await userInfo(); console.log(res); } fetchUserInfo(); // zhangsan // 不是异步promise let testFn = function test(){} async function notPromise() { var str = await testFn; console.log(str); // function test(){} } notPromise();
function userInfo() { return new Promise((resolve) => { setTimeout(() => { resolve(`接口返回值---------------1`); }, 2000); }); } console.log("1"); let p1 = new Promise((resolve, reject) => { resolve("p1"); }); let p2 = new Promise((resolve, reject) => { resolve("p2"); }); async function getUserInfo() { console.log("2"); p1.then((res) => { console.log(res); }); var awaitRes = await userInfo(); console.log(awaitRes); // 接口返回值---------------1 p2.then((res) => { console.log(res); }); console.log("3"); } console.log("4"); getUserInfo(); // 异步方法,加入任务队列执行 console.log("5"); /** * * 执行顺序 * * 1 * 4 * 2 * 5 * p1 * 接口返回值---------------1 * 3 * p2 * * * */
所以整个代码块执行的顺序是:
1,4,2,5,p1,接口返回值---------------1,3,p2
以上就是js中async和await简单解析以及在面试中可能会问到的关于队列的一些场景和知识点,有任何问题欢迎留言,后续的文章整理然后作为补充。
文章博客地址:JavaScript中async和await的使用以及队列问题
创作不易,转载请注明出处和作者。