浅析 js 异步编程(1) callback

137 阅读2分钟

异步编程的基础 -- callback

思考问题: callback 只是一个普通的高阶函数(类似函数指针),是什么机制让其可以为异步编程提供帮助?

callback 代码示例

首先看下面同步执行的代码,思考一下运行结果(请一定要先思考!).

timeconsume 是一个非常耗时的操作(比如 server 处理客户端 POST 请求同时获取用户上传的数据,为了便于理解代码示例如下图,与本文关系不大),

image.png

紧跟其后的函数getreult是一个低耗时操作,但是需要timeconsume的返回值result作为参数(我将它称之为伴随函数).

callback 在异步编程中的作用

上面代码蕴含了同步编程一个很大的问题:阻塞 .

由于getresult没有接收到 result不能执行, 那么在其之后的三个console.log(1)(在这里代表许多与getreult, timeconsume 完全无关的操作)也不能运行了, 都在等待timeconsume. 所以为了让后面代码顺利运行, 我们必须思考一种可以将高耗时操作从主线程中抽离出来的模式, 这就是异步编程.

现在假设我们实现了这种技术, 成功将timeconsume剥离出来了, 但是衍生出来的问题是getresult需要timeconsume的结果,虽然它是一个短时操作, 但是由于得不到result, 它同样阻塞了后面代码的执行,故之前好不容易实现了的异步模式相当于白搭了.

那么callback闪亮登场, 它出现的目的就是解决getresult依赖timeconsume的问题.

解决的方案:getresult作为一个 high-order function(高阶函数) 传入timecounsume的参数当中, 当高耗时操作timecounsume执行完成之后(注意: 现在timecounsume已经实现了与主线程剥离), getresult便可以接收 result 作为参数来执行, 同时它还有着提醒这个支线程结束的功能,

那么什么是 callback? 这个被传入函数的getresult 就被称为callback, 它没有什么特别的.

conclusion:callback 作用在于将伴随函数从主线程剥离.它与将高耗时函数从主线程剥离毫无关系.

我之前一直认为 callback 可以将高耗时函数从主线程中剥离. 未完待续..