Promise 基本用法

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(){
    
    })

猜你喜欢

转载自blog.csdn.net/weixin_43915401/article/details/109855806