# 回调函数

首先,我们要知道的是回调并不都是异步处理,可以同步回调,也可以异步回调

# 异步

什么叫异步什么叫同步?举个例子来说,同步就是你先刷牙接着吃早饭,异步就是你在刷牙的同时厨房在煮着粥。 看一下异步的例子

console.log('1')
setTimeout(() => {
    console.log('2')
}, 0)
console.log('3')
1
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

输出结果:

执行完成
第二次执行
1
2

# 异步回调

function wait(callback) {
    setTimeout(() => {
        callback('执行完成')
    }, 2000)
}
wait(msg => {
    console.log(msg)
})
console.log('第二次执行')
1
2
3
4
5
6
7
8
9

输出结果:

第二次执行
执行完成
1
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

输出结果是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
Last Updated: 12/2/2019, 10:17:52 PM