初识Promise
写完callback的一个异步编程小作业之后,去看了看Promise,惊为天人,还以为能把异步函数封装成同步函数(现在想想是思维错误,结果用的时候一堆bug,参考了各路博客和MDN的资料后,才发现自己理解错了,故而小记一下
第一次用
刚开始写时,我是类似这样写的
1 | var p = new Promise(resolve => { |
这样写正是我刚才说的异步变同步的弱智操作。实际异步编程的优越性正在于它的异步性,而我一味追求同步(阻塞线程)无疑是走了误区。
理解
MDN的资料是这样说的:
A Promise is in one of these states:
- pending: initial state, neither fulfilled nor rejected.
- fulfilled: meaning that the operation completed successfully.
- rejected: meaning that the operation failed.
其实个人觉得这个没什么卵用,Promise的实际使用其实和这个没什么关系,只是把return
和throw
变成了resolve
和reject
,对于简单的callback,可以直接传函数参数作为resolve
和reject
,而且代码量似乎还多了一点。不过如果是“Callback Hell”或是比较特殊的异步要求,Promise就体现了他的强大。
个人认为Promise的核心其实只有以下一段:
1 | var p = new Promise((resolve, reject) => { |
所以如果要实现链式的话,就需要在每个then
的函数里return
一个新的Promise
对象,刚开始我觉得这样很麻烦,似乎没有改变callback的弊端,但再仔细想想,如果把每个异步函数包装成一个函数,则then
的参数便只是一个简单函数名字,多个then
放在一起岂不是比callback hell
赏心悦目且直接?而且对于调试和维护也会更方便。
1 | var p = new Promise(async) |
至于其他的Promise.all
和Promise.race
因为还没用过,所以谈不上理解,但是all
的好处显而易见,假设有多个异步请求同时进行,当它们都完成时便可以触发某个事件,这用all
可以说是很轻松了,我之前做作业时是每个请求都判断一次当前状态是否满足条件,相形见绌。
结语
这篇文是在做完web作业的晚上随便写写的(毕竟很久没更新了),理解谈不上多深层,只是使用的感受罢了。ES7有async
和await
(听说是根据tj大神的co加的,膜),据说是解决异步的终极方案,然而我还没看。参考了阮一峰的ES6入门和MDN
评论