# 回调函数
首先,我们要知道的是回调并不都是异步处理,可以同步回调
,也可以异步回调
。
# 异步
什么叫异步什么叫同步?举个例子来说,同步就是你先刷牙接着吃早饭,异步就是你在刷牙的同时厨房在煮着粥。 看一下异步的例子
console.log('1')
setTimeout(() => {
console.log('2')
}, 0)
console.log('3')
1
2
3
4
5
2
3
4
5
尽管settimeout的时间为0,输出结果是1,3,2。
同步回调函数
是要等到回调函数都执行完成后才能进行接下来的操作,也就是说是阻塞式运行
异步回调函数
不需要等到回调函数都执行完成后才能进行接下来的操作,也就是说是非阻塞式运行
# callback原理
简单的说,就是把一个函数作为形参进行传递,下面的callback
参数可以改为任意名字。
# 同步回调
function wait(callback) {
var cur = new Date();
var pus = 0;
while (pus < 5000) {
var date = new Date();
pus = date - cur
}
callback('执行完成')
}
wait(msg => {
console.log(msg)
})
console.log('第二次执行')
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
输出结果:
执行完成
第二次执行
1
2
2
# 异步回调
function wait(callback) {
setTimeout(() => {
callback('执行完成')
}, 2000)
}
wait(msg => {
console.log(msg)
})
console.log('第二次执行')
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
输出结果:
第二次执行
执行完成
1
2
2
# 例子
var fs = require('fs')
function getData() {
fs.readFile('./mime.json', (err, data) => {
return data
})
}
console.log(getData())
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
输出结果是undefined
原因是因为这是一个异步的函数,如果想输出结果,可以改写一个回调函数,如下:
var fs = require('fs')
function getData(callback) {
fs.readFile('./mime.json', (err, data) => {
callback(data)
})
}
getData(data => {
console.log(data)
})
```
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9