学习技巧:精通回调的思想,精通异步编程的思想,然后可学会promise
回调函数
function fn(callback) {
setTimeout(function () {
console.log("神仙树");
callback("千里马");
}, 1000);
}
fn(function (data) {
console.log(data);
});
异步编程
function fn(az, a) {
for (var i = 0; i < a; i++) {}
az()
}
//异步函数
console.log("nice")
fn(function () {
console.log("to")
}) //这个函数内部要一个打印"to"
console.log("meet")
// fn函数不可能是异步函数,但是是js的底层,c/c++是有不阻塞代码的异步函数的
setTimeout(function () {
console.log("you")
}, 1000)
console.log("well")
promise语法
Promise是一个构造函数,创建了一个数据容器,它主动产生数据,不用给它添加数据,而是它自己产生数据
fn(function(){console.log(1)})是阻塞异步
setTimeout()函数是一个非阻塞的异步函数
promise对象的then函数也是一个非阻塞的异步函数
var x = new Promise(function (a, b) {
var y = Math.floor(Math.random()*10)
a(y) //a调用了 就代表x产生了数据
})
// x数据容器取数据用then函数
var re = x.then(function (data) {
console.log(data, 111)
return 200
})
// then函数是一个异步函数
console.log(222)
re.then((data) => {
console.log(data, 2222222)
})
then函数的返回值是一个新的promise对象
是then传入的回调函数的返回值:
(1)如果是一个promise对象 那么就是它
(2)如果不是一个promise对象,那么就会把函数的结果包装为一个生成数据了的promise对象
任务的队列分类
任务指的就是js代码中的运行的代码
任务分为同步任务和异步任务
同步任务:
function fn(a){}
var a=new Array()
var b=fn()
异步任务
console.log(0) //先执行
setTimeout(() => {
setTimeout(() => {
console.log(1) //
}, 1000)
console.log(2)
var p2 = new Promise((n1, n2) => {
n1(1000)
})
p2.then(() => {
console.log(3)
})
}, 0)
var p1 = new Promise((n1, n2) => {
n1(1000)
})
p1.then(() => {
console.log(4) //Ⅱ
})
console.log(5) //先执行
异步任务的队列优先级: 主任务最先执行,然后 异步微任务执行,再执行异步宏任务
任务开启后:内部执行的时候可能会有新的任务
宏:脚本就是一个宏任务
脚本运行 执行第一个宏任务:
(1)先执行同步任务
(2)添加新的宏任务到队列中 添加新的的异步微任务
(3)执行异步微任务