Promise是异步编程的一种解决方法。
简单说就是一个容器,保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,Promise是一个对象,从它可以获取一步操作的消息。
Promise对象有两个特点:
1 对象状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),只有异步操作的结果可以决定当前是哪种状态。
2 一旦状态改变,就不会再改。任何时候都可以得到这个结果。
Promise对象状态改变只有两种可能,pending变为fulfilled 和 pending变为rejected。
只要这两种情况发生,状态就凝固了,不会再发生变化,会一直保持这个结果。这时就被称为resolved(已定型)
如果改变已经发生,再对Promise对象调用回调函数,也会立即得到这个结果
这与事件(Event)不同,事件是如果错过了它,再去监听是得不到结果的
Promise缺点:
1 无法取消Promise,一旦新建就会立即执行, 无法中途取消
2 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
3 当处于pending状态时,无法得知目前进展到哪个阶段(刚刚开始还是即将完成)。
基本用法
const promise = new Promise(function (resolve, reject) {
// ..操作
console.log(1)
if (true /*异步操作成功 */) {
console.log(2);
resolve(/*value返回参数*/)
}
else {
console.log(3)
reject(/*error错误信息*/)
}
})
promise.then(function (value) {
/*promise执行成功回到函数*/
// ...操作
console.log(4);
}, function (error) {
/*promise执行失败回到函数*/
// ...操作
console.log(6)
})
console.log(6)
//1
//2
//6
//4
promise新建后立即执行,首先输入promise,再执行当前脚本所有同步任务,在执行then方法指定的回调函数
const p1 = new Promise(function(resolve, reject){
})
const p2 = new Promise(function(resolve, reject){
resolve(p1)})
p1和p2都是Promise的实例,但是p2的resolve方法将p1作为参数,即一个异步操作的结果返回另一个异步操作。p1的状态就会传递给p2,p1的状态就会传递给p2,p1的状态就会传递给p2,p2自己的状态就无效了
如果p1的状态是pending,那么p2的回调函数就会等待p1的状态改变,如果p1的状态已经是resolved或rejected,那么p2的回调函数就会立即执行
resolve或reject并不会中介Promise的参数函数的执行
new Promise(function (resolve, reject) {
resolve(1);
console.log(2)
}).then(r => {
console.log(r)
})
console.log(3)
//2
//3
//1
resolve的promise是在本轮事件循环的末尾执行,所以先执行console.log(2),再执行resolve(1)
new Promise(function (resolve, reject) {
return resolve(1);
console.log(2)
}).then(r => {
console.log(r)
})
console.log(3)
//3
//1
加上return,后面的console.log(2)就不会再执行
Promise.prototype.then()
then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调参数
then方法返回的是一个新的promise实例,不是原来那个,因此可以采用链式写法,即then方法后面再调用另一个then方法
getJSON.('/post.json').then(function(json){
return json.post
}).then(function(){
})