promise 是 es6 的特性,现代主流浏览器基本上都已经支持,可以放心使用了。
promise 对象代表一个异步操作,具有3中状态:
1、pending :初始状态。
2、resolve:操作成功的状态。
3、reject:操作失败的状态。
创建 promise 对象后,会立即执行,其状态为 pending ;执行之后只有2中结果:执行成功会变成 resolve 状态,执行失败会执行 reject 状态。
promise 的状态是无法获取的,它是内部变量。但可以在控制台的输出可以看见:

而且该状态也不需要获取,因为promise一旦建立,就会执行,而且该执行过程是不可以取消的,所以执行结果始终都会在promise.then()或者promise.catch()方法中出现。
promise 的优缺点:
优点:
1、将异步操作以同步操作的方式表达出来,避免层层嵌套回调函数
2、提供统一的操作接口,方便对异步操作的控制
缺点:
1、promise一旦建立,则不可取消
2、如果不设置回调函数,则会在promise内部抛出错误,不会反应到外部
3、当状态是pending是,无法判断当前状态(是异步刚刚开始执行还是即将完成了异步操作)
promise 的用法:
创建一个 promise 对象
var myPromise = new Promise(function(resolve, reject){
// 执行异步操作逻辑
// 异步操作成功了,则调用 resolve() 方法
// 异步操作失败了,则调用 reject() 方法
})
例子:
var myFirstPromise = new Promise(function(resolve, reject){
//当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
setTimeout(function(){
resolve("成功!"); //代码正常执行!
}, 250);
});
myFirstPromise.then(function(successMessage){
//successMessage的值是上面调用resolve(...)方法传入的值.
//successMessage参数不一定非要是字符串类型,这里只是举个例子
document.write("Yay! " + successMessage);
});
promise 相关API:
1、promise.then(onFulfilled, onRejected) 或者 promise.then(onFulfilled).catch(onRejected) 这两个写法是等价的,都是执行promise执行成功和失败的处理
2、promise.then、promise.catch、promise.finally 的链式操作
promise.prototype.then 方法返回的是一个新的 Promise 对象,因此可以采用链式写法。
例子:
const myPromise =
(new Promise(myExecutorFunc))
.then(handleFulfilledA,handleRejectedA)
.then(handleFulfilledB,handleRejectedB)
.then(handleFulfilledC,handleRejectedC)
.finally(finallyHandleFunc);
// 或者,这样可能会更好...
const myPromise =
(new Promise(myExecutorFunc))
.then(handleFulfilledA)
.then(handleFulfilledB)
.then(handleFulfilledC)
.catch(handleRejectedAny)
.finally(finallyHandleFunc);
3、promise.all(iterable)
这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败。
4、promise.allSettled(iterable)
等到所有promises都已敲定(settled)(每个promise都已兑现(fulfilled)或已拒绝(rejected))。
返回一个promise,该promise在所有promise完成后完成。并带有一个对象数组,每个对象对应每个promise的结果。
5、promise.any(iterable)
接收一个Promise对象的集合,当其中的一个 promise 成功,就返回那个成功的promise的值。
6、promise.race(iterable)
当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise绑定的相应句柄,并返回该promise对象。
7、promise.resolve(value)
返回一个状态由给定value决定的Promise对象。
例如:
var p = Promise.resolve('Hello');
p.then(function (s){
console.log(s)
});
// Hello
8、promise.reject(reason)
返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法
例子:
var p = Promise.reject('出错了');
p.then(null, function (s){
console.log(s)
});
// 出错了
