前言

最近在看ES6新特性Promise的时候,看到了Callback这个概念,我以较表面的层次,理解下callback。

Callback是异步执行或晚一些执行的函数。异步编程是根据之前函数的执行速度,在不同的时间,执行不同函数,而非按照程序代码的顺序执行,之前函数可以是比如http请求或文件读取。

下面的示例代码使用node。

1
2
3
4
5
6
7
8
9
10
11
12
13
var fs = require('fs')
var myNumber = undefined
function addOne() {
fs.readFile('number.txt', function doneReading(err, fileContents) {
myNumber = parseInt(fileContents)
myNumber++
})
}
addOne()
console.log(myNumber)

上面的代码会输出undefined,这是因为fs.readFile方法是一个异步方法。它会访问硬盘或者进行网络请求,这些都会是异步的。此时如果恰巧正在处理的程序在访问呢内存或访问CPU,那么其他程序工作就是异步的。因为I/O访问真的非常慢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var fs = require('fs')
var myNumber = undefined
function addOne(callback) {
fs.readFile('number.txt', function doneReading(err, fileContents) {
myNumber = parseInt(fileContents)
myNumber++
callback()
})
}
function logMyNumber() {
console.log(myNumber)
}
addOne(logMyNumber)

上面的代码会成功输出结果,我们在addOne函数中传入了一个callback函数,在执行fs.readFile的时候该函数会检查该函数是否完成,如果完成,那么那么就执行后面的function里面的内容,这时我们的callback函数就会被系统回调,所以说编写callback时我们并不需要知道异步行为什么时候完成,而只需要知道在哪里完成。

参考链接:https://github.com/maxogden/art-of-node#callbacks