断断续续学习es6也有一段时间了,趁着开学空闲对知识点作一些小结。javascript
谈到Promise,咱们知道,这是社区较理想的异步编程解决方案。想要掌握promise,咱们首先要知道其提出缘由。promise的提出很好的解决了多个相互依赖的代码之间的嵌套问题,好比说C代码须要B代码的结果,B代码须要A代码的结果,用传统的方案,会出现层层嵌套的状况,不易维护。java
promise对象一共有三种状态es6
promise对象有几种相关方法编程
let promise = new Promise((resolve,reject) => { //.... resolve('2'); //.... //reject('4'); })
最简单建立对象的方法,就是为resolve和reject的状态分别传递参数,也就是成功后的信息或是失败时的提示,固然,不必定要两种状态同时都有。promise
then方法,接受两个参数,第一个为fulfilled状态下要进行的步骤,第二个参数可选,指的是rejected状态下执行的方法
固然,更推荐使用catch方法来定义错误状态下的方法,也和try...catch结构相似异步
promise .then((data) => { //cb // success }) .catch((err) => { // error });
这个对象有几个特色,异步编程
1.好比状态一旦更改,就不会再发生变化,也就是说pending状态一旦转换成fulfuilled或rejected就再也不变化了。函数
let promise = new Promise((resolve,reject) => { resolve('2'); reject('4'); })
好比上面的代码,promise在进入fulfulled状态后就再也不发生变化了,所以reject的操做是无效的。学习
2.好比promise对象建立中的代码是同步的,而then方法是异步的。ui
let promise = new Promise((resolve, reject) => { console.log('1'); resolve('2'); }); promise.then((resolve,reject) => { console.log(resolve); }) console.log(3); // 1 3 2
promise对象建立之后当即执行,故输出1,then方法为异步执行,被放入等待的实践队列,在本次事件循环结束时执行,故先打印3,最后打印2。
3.不会主动抛出错误
这一点比较特别,意味着咱们必须定义catch方法或then的第二个参数来获取错误,否则,错误没法被发现
4.chain 链式结构
then函数的能够接另外一个then函数,而then函数返回一个promise对象,所以,这一个promise对象就决定了执行后面的哪些方法
then方法与settimeout
这一个问题很是典型,其实只要明白一点:settimeout在下一轮“事件循环”的时候开始执行,Promise.then()在本轮“事件循环”结束时执行。
setTimeout(function () { console.log('1'); }, 0); Promise.resolve().then(function () { console.log('2'); }); console.log('3');
输出3 2 1
其实,这些方法,仍是要多使用,多练习,才能驾轻就熟