异步回调
回调地狱?
首先我们说一下同步情况下,一切逻辑都是正常的,函数的输出都是预期的,可以根据执行的顺序进行输出,那么当出现异步的时候,还会依据执行顺序输出吗?看代码:rocket
异步函数
function demo2(params) {
setTimeout(()=>{
return "hello"
},2000)
}
demo2()
实际输出是 undefine
异步函数中的回调
接上边,我们无法取到正确的值,原因就是我们在异步当中无法通过 return 获取到值,正确的方式是通过回调函数
function demo(fun) {
setTimeout(()=>{
fun("hello")
},1000)
}
demo((data)=>{
console.log("---",data)
})
异步函数中的顺序
如果我们有两个异步,而且我想让他按照顺序去执行怎么办?
function demo1(fun) {
setTimeout(()=>{
fun("hello")
},2000)
}
function demo2(fun) {
setTimeout(()=>{
fun("hello")
},1000)
}
demo1((data)=>{
console.log("demo1",data)
})
demo2((data)=>{
console.log("-demo1-",data)
})
预期结果不如意:demo2 先输出,那么如何让其保证顺序呢,我们接着改
回调地狱
demo1((data)=>{
console.log("demo1",data)
demo2((data)=>{
console.log("demo2",data)
})
})
当 demo1 执行完了再去执行 demo2,这样就保证的顺序,如果嵌套多个呢,这就是回调地狱,说了半天,终于要进入正题了
Pormise 大法来了
Promise 就是为了解决回调地狱而诞生,我们小试一刀
let demo1 = new Promise((resolve)=>{
setTimeout(()=>{
resolve("demo1")
},2000)
})
let demo2 = new Promise((resolve)=>{
setTimeout(()=>{
resolve("demo2")
},1000)
})
demo1.then(res=>{
console.log(res)
return demo2;
}).then(res=>{
console.log("demo2",res)
})
终极大法 Async
async function demopp(){
let a = await demo1
let b = await demo2
console.log(a,b) //类似then
}
demopp()
最后,我们总结几点重要的东西,暂时就想到一点哈哈:
Promise 中的 then 的结果是由 reslove 函数返回的,即 resolve 中传出来的值是 then 的形参,我们平时使用的 fetch().then()同理