前言
最近在看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