承诺-Promise

292 阅读2分钟

es6最让人兴奋的,莫属Pormise,给你一个承诺,而且不会反悔的。

要说异步的解决方案,也迭代了好几个版本。

最原始的回调,可读性还好,但是代码写起来,稍复杂一点那就陷入回调地狱了,苦苦挣扎只是将回调再抽象一下。

或者是事件监听,发布订阅,根源上也都是回调。

直到后来的Promise,将异步方案从原来的嵌套调用,优雅地变成了链式调用。

最终极的方案应属是Generator,利用async和awite的语法糖,将异步代码看起来像同步一样执行。

今天简单聊聊Promise,我也是小白哈,有大神请不吝赐教。

Promise的实现一开始起源于社区,被众多开发者所热衷和追捧,后来被es6纳入了标准,这也就是标准的意义。

Promise就像是一个容器,里面保存着未来某个时间才会结束的事件。想象保存着一个ajax请求,未来的某个时间一定或结束,可能是成功,也可能是失败。

有几个需要注意的点:

  1. Promise对象一旦创建就会立即执行。
  2. 有三种状态,padding(进行中),resolve(成功),reject(失败),内部状态不受外部影响,只有异步操作的结果才决定当前的状态。
  3. 状态会由padding变成resolve或reject,一旦变更后不可更改。

缺点:

  1. 一旦创建,就无法取消。
  2. 如果不设置错误回调,内部的错误不会被抛出到外部。
  3. 当内部处于padding状态时,外部无法知道异步操作进行到了什么阶段。
promise
let pro = new Promise((res, rej) => {
setTimeout(() => {res('test')}, 2000)
});
}).catch((e) => {
});

创建一个Promise实例,接受一个方法,方法传入两个参数resolve,reject,均是方法,不需要自己部署,由内部js引擎提供。

调用resolve,表示异步执行成功,状态由padding变成resolve。

调用reject,表示异步执行失败,状态由padding变成reject。

生成的pro实例对象上,被挂载了then方法,当内部状态由padding变成resolve时,会调用then方法,其中调用res执行的时候的传参,会被传入到then方法内的参数。

未来待续。。。