ES6 Promise 对象

前言

ES6 都出来三年了,在 ES6 中将 Promise 正式列为标准,这也就意味着 JavaScript 的异步编程又有一种新的写法,且这种写法更加的优雅,更易于维护。毕竟,Node.js 中大部分都是异步的。我写这篇文章主要对 Promise 对象进行系统的叙述讨论,并以此展开 JavaScriot 的运行机制。从而提高自己的知识水平,毕竟,人总是在积累、总结中成长的。


单线程的 JavaScript

由于 JavaScript 中充斥着很多的 DOM 操作,为了避免进程之间的死锁,所以将其设计成了单线程。而单线程就意味着一次只能处理一个任务,等上一个任务处理完成后,才进行下一个任务的处理。为了优化处理任务的速度,将两种,一种同步任务,另一种是异步任务。其中,同步任务在主线程上排队等待执行,而异步任务则将其挂起,放进任务队列中,只有任务队列中通知主线程,某个异步任务可以执行时,才将放入主进程中执行。


回调地狱

回调函数,就是那些被主线程挂起来的代码,异步任务必须指定其回调函数,当主线程开始执行异步时,就是执行他的回调函数。而当异步任务到达某种程度时,或者回调函数使用不当时,就会形成所谓的回调地狱,回调函数里嵌套回调函数,一两层还好,但有时候业务逻辑的复杂,回调函数甚至可以达到 10 层以上。
这里做一个简单的示范:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(() => {
setTimeout(() => {
console.log("第一层回调函数");
setTimeout(() => {
console.log("第二层回调函数");
setTimeout(() => {
console.log("第三层回调函数");
setTimeout(() => {
console.log("第四层回调函数");
}, 2000);
}, 2000);
}, 2000);
}, 2000);
})();

如上面这样写异步任务,就显得不够有优雅,不太易于寻常人类的阅读,形成所谓的回调地狱。


Promise

而 Promise 对象的出现,从某种程度上避免了回调地狱,可以更加优雅的来写异步的代码,不过并不是真正意义上的消灭回调函数,而是将其转换成一个又一个的 then() ,但聊胜于无,有更加优雅的方式总比没有好。总而言之,就是 Promise 对象提供统一的 API ,各种各样的异步任务够可以使用其提供的 API,采用同样的方法来编写代码,更加的优雅。
最后在浏览器控制台中,console.dir() 一下 Promise 对象,看看它的庐山真面目,好在下文探究

Promise对象


未完待续…

PS: 最近接入了 gitTalk , 也可以手动提交 issues 进行讨论,我会在第一时间进行回复。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×