本文已参与「新人创作礼」活动,一起开启掘金创作之路。
4、JavaScript 的异步机制:
-
所有同步任务都在主线程上执行,形成一个执行栈
-
主线程之外,还存在一个任务队列,只要异步任务有了结果,就会在任务队列中放置一个事件
-
一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面还有哪些事件,那些对应的异步任务,于是 结束等待状态,进入执行栈,开始执行
主线程不断的重复上面的第三步
5、异步编程:
- 回调函数(Callback)
回调函数有一个致命的弱点,就是容易写出回调地狱
回调函数的优点是简单、容易理解和实现;
缺点是不利于代码的阅读和维护,各个部分之间高度耦合,使得程序结构混乱、流程难以追踪(尤其是多个回调函数嵌套的情况),而且每个任务只能指定一个回调函数。
此外它不能使用 try catch 捕获错误,不能直接 return。
- 事件监听:
这种方式下,异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生。
f1.on('done', f2);
当f1发生done事件,就执行f2。
优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以"去耦合"(Decoupling),有利于实现模块化。
缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
- 发布订阅:
我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,
其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。
这就叫做"发布/订阅模式"。
可以通过查看“消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
- Promise
Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果。
什么时候会用到过一段时间?答案是异步操作,异步是指可能比较长时间才有结果的才做,
例如网络请求、读取本地文件等。
这个承诺一旦从等待状态变成为其他状态就永远不能更改状态了
三种状态
Pending -- promise对象实例创建时候的初始状态
Fulfilled -- 成功的状态(resolved)
Rejected -- 失败的状态
链式调用