es6最让人兴奋的,莫属Pormise,给你一个承诺,而且不会反悔的。
要说异步的解决方案,也迭代了好几个版本。
最原始的回调,可读性还好,但是代码写起来,稍复杂一点那就陷入回调地狱了,苦苦挣扎只是将回调再抽象一下。
或者是事件监听,发布订阅,根源上也都是回调。
直到后来的Promise,将异步方案从原来的嵌套调用,优雅地变成了链式调用。
最终极的方案应属是Generator,利用async和awite的语法糖,将异步代码看起来像同步一样执行。
今天简单聊聊Promise,我也是小白哈,有大神请不吝赐教。
Promise的实现一开始起源于社区,被众多开发者所热衷和追捧,后来被es6纳入了标准,这也就是标准的意义。
Promise就像是一个容器,里面保存着未来某个时间才会结束的事件。想象保存着一个ajax请求,未来的某个时间一定或结束,可能是成功,也可能是失败。
有几个需要注意的点:
- Promise对象一旦创建就会立即执行。
- 有三种状态,padding(进行中),resolve(成功),reject(失败),内部状态不受外部影响,只有异步操作的结果才决定当前的状态。
- 状态会由padding变成resolve或reject,一旦变更后不可更改。
缺点:
- 一旦创建,就无法取消。
- 如果不设置错误回调,内部的错误不会被抛出到外部。
- 当内部处于padding状态时,外部无法知道异步操作进行到了什么阶段。
promise
let pro = new Promise((res, rej) => { setTimeout(() => {res('test')}, 2000)});pro.then((param) => {}).catch((e) => {}); |
创建一个Promise实例,接受一个方法,方法传入两个参数resolve,reject,均是方法,不需要自己部署,由内部js引擎提供。
调用resolve,表示异步执行成功,状态由padding变成resolve。
调用reject,表示异步执行失败,状态由padding变成reject。
生成的pro实例对象上,被挂载了then方法,当内部状态由padding变成resolve时,会调用then方法,其中调用res执行的时候的传参,会被传入到then方法内的参数。
未来待续。。。