异步函数拿多个不同时间打印的数据,不能用return,得用回调函数。若需要控制顺序,则应该主执行函数嵌套,但嵌套多了,代码就不方便维护。这就是回调地狱。
es5用回调函数拿异步数据。
es6用then拿,最终用async
Promise对象用于异步按想要的顺序打印多个不同时间的数据,配合async和 await 可以用同步的方式写异步获取数据。
//promise对象 最经典的方法,记住!//resolve可以将异步数据传递出来let p = new Promise(function(resolve){resolve("hello world")});//通过then拿到异步数据 es6p.then(function(data){console.log(data); //data就是resolve传出来的数据(hello world)});//resolve传出来的值,是then里面的形参以上是es6老方法----------------------------------------------------------------------------------以下是es6 async新方法比异步函数写法好一些,避免回调地狱,但异步一多会有一堆thenfunction getTea(){return new Promise(funciton(resolve){setTimeout(()=>{resolve("奶茶");},1000)})};function getHotpot(){return new Promise(function(resolve){setTimeout(()=>{resolve("火锅");},2000)})}//先吃火锅,再喝奶茶//Promise写法的链式获取异步操作getHotpot().then(function(data){console.log(data);return getTea();}).then(function(data){console.log(data);})//两秒输出火锅,再一秒输出奶茶-------------------------------------------------------------------------------//async函数,解决异步数据问题的终极方法function getTea(){return new Promise(funciton(resolve){setTimeout(()=>{resolve("奶茶");},1000)})};function getHotpot(){return new Promise(function(resolve){setTimeout(()=>{resolve("火锅");},2000)})}//以上同上//async函数,解决异步数据问题的终极方法async function getData(){//await后面跟Promise对象 加await可以直接获取resolve传递出来的异步数据,不用then了let hotpot = await getHotpot();// getHotpot()是一个promise对象console.log(hotPot);let tea = await getTea();console.log(tea);//看着像同步执行了}getData(); //输出 火锅 奶茶

async函数的返回值是promise对象
async function fun(){return 1;};let a = fun();console.log(a);打印Promise {1}--------------------------------------------------------------------//async其实就是Promise对象的简写async function fun(){return 1;};//以上换成Promise写法,二者一模一样function fun(){return new Promise((resolve) => {resolve(1);})};fun().then((data)=>{console.log(data);})-----------------------------------------------------------------//async await写法//p1是Promise对象let p1 = new Promise((resolve) => {resolve(1)})//p2是Promise对象let p2 = new Promise((resolve) => {resolve(2)})async function fun(){let a = await p1;let b = await p2;console.log(a);console.log(b);}fun();-------------------------------------------------------------------
题目1:
执行结果 200 100 不明白注释
题目2:
打印 1 3 5 8 2 6 7 4
总结: js执行顺序
- 同步
- process.nestTick
- 事件循环里的微任务(promise.then)
- 宏任务(计时器,ajax,读取文件)
- setImmediate
