什么是promise
promise是JS的一种异步编程解决方案。setTimeout和Ajax都是常见的异步回调方案,但是他们都有一个问题,就是对于复杂的回调会产生层层嵌套的问题,代码会像一个横放的金字塔意一样一层套一层,编码体验极差。promise的多重链式回调可以很好的解决这个问题。
怎么用promise
首先promise对象代表的是现在未完成,但是将来会完成的操作。它一共有三个状态:
- pending,代表初始状态
- fulfilled,代表操作成功
- rejected,代表操作失败
promise的状态只会改变一次,改变了就会一直保持这个状态
构建一个promise对象
var promise = new promise(function (resolve,reject) {
}
promise的参数为函数,resolve是一部操作执行成功时执行的函数,reject是异步操作执行失败时执行的函数。
promise的基本api
1.then()
.then()方法可以指定resolve和reject状态下回调的函数
promise.then(function (data) {
//操作成功状态执行的内容
},function (error) {
//操作失败状态执行的内容
})
2.catch()
.catch()方法用于指定发生错误时的回调函数,可以看作是用来捕获错误的。虽然用.then()方法就可以指定reject状态下的回调函数,但是promise对象抛出的错误不会传递到外层代码,浏览器就不会抛错(除了chrome)。
promise.catch(function (error) {
})
3.all()
.all()方法的作用是将多个promise实例包装成一个新的promise实例,且只有所有promise实例状态都变成fulfilled,新的promise实例状态才会变成fulfilled。
只要有一个是rejected,新实例的状态就会变成rejected。
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 3000, "first");
});
var p2 = new Promise(function (resolve, reject) {
resolve('second');
});
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "third");
});
Promise.all([p1, p2, p3]).then(function(values) {
console.log(values);
}