异步函数拿多个不同时间打印的数据,不能用return,得用回调函数。若需要控制顺序,则应该主执行函数嵌套,但嵌套多了,代码就不方便维护。这就是回调地狱。
es5用回调函数拿异步数据。
es6用then拿,最终用async
Promise对象用于异步按想要的顺序打印多个不同时间的数据,配合async和 await 可以用同步的方式写异步获取数据。
//promise对象 最经典的方法,记住!
//resolve可以将异步数据传递出来
let p = new Promise(function(resolve){
resolve("hello world")
});
//通过then拿到异步数据 es6
p.then(function(data){
console.log(data); //data就是resolve传出来的数据(hello world)
});
//resolve传出来的值,是then里面的形参
以上是es6老方法
----------------------------------------------------------------------------------
以下是es6 async新方法
比异步函数写法好一些,避免回调地狱,但异步一多会有一堆then
function 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