ES6 - Promise

基础

Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值.

const p =  new Promise((resolve,reject)=>{
    });
console.dir(p)

两个属性:

State: 状态

Result: 结果

三种状态

一个 Promise有以下几种状态:

pending: 初始状态,既不是成功,也不是失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。

状态改变:Resovle 和 Rejected

接收 2个参数

const p = new Promise((resolve, reject) => {
	// resolve(): 调用函数, 使当前Promise对象的状态改成fulfilled
  resolve();
})
console.dir(p) // fulfilled
const p = new Promise((resolve, reject) => {
  // resolve(): 调用函数, 使当前Promise对象的状态改成fulfilled
  // reject(): 调用函数, 使当前Promise对象的状态改成rejected
  // resolve();
  reject()
})
console.dir(p) //rejected

结果

const p = new Promise((resolve, reject) => {
  // 通过调用 resolve,传递参数,改变 当前Promise对象的结果
  resolve("成功的结果");
  // resolve();
  // reject("失败的结果")
})
console.dir(p) 

方法

(1)then

then(onFulfilled)
then(onFulfilled, onRejected)

onFulfilled 可选

一个在此 Promise 对象被兑现时异步执行的函数,此函数被调用时将传入以下参数:

value

Promise 对象的兑现值。

onRejected 可选

一个在此 Promise 对象被拒绝时异步执行的函数,此函数被调用时将传入以下参数:

value

(1.1)普通 then

    const p = new Promise((resolve, reject) => {
        // 通过调用 resolve,传递参数,改变 当前Promise对象的结果
        // resolve("成功的结果");
        reject("失败的结果")
    })

    // .then方法函数
    // 参数
    // 两个参数都是函数
    // 返回值: 是一个Promise对象
    p.then(() => {
        // 当Promise的状态使fulfilled时执行
        console.log("成功的回调")
    }, () => {
        // 当Promise的状态时rejected时, 执行
        console.log("失败时调用")
    })
    console.dir(p)

(1.2)带 value 的 then

const p1 = new Promise((resolve, reject) => {
  // 通过调用 resolve,传递参数,改变 当前Promise对象的结果
  // resolve(123);
  reject("失败的结果")
})

//then方法函数
// - 参数
// 两个参数都是函数
// 返回值: 是一个Promise对象
p1.then((value)=>{
  //当Promise的状态使fulfilled时执行
  console.log("成功的回调:",value)
},(err)=>{
  // 当Promise的状态时rejected时, 执行
  console.log("失败时调用:",err)
})
console.dir(p1) 

(1.3)Promise的状态不改变,不会执行then里的方法

// 如果Promise的状态不改变,then里的方法不会执行
const p = new Promise((resolve, reject) => {
  
}).then.((value) => {
	console.log("成功")
},(reason) => {
console.log("失败")
})

(1.4)在then方法中,通过return将返回的Promise实例改为 fulfilled 状态

// 如果Promise的状态改变,then里的方法不会执行
const p = new Promise((resolve, reject) => {
  
})
const t = p.then.((value) => {
	console.log("成功")
  // 使用return可以将t实例的状态改为fulfilled
  return 123
},(reason) => {
  // 如果这里代码出错,会将t实例的状态改为rejected
console.log("失败")
})
t.then.((value) => {
	console.log("成功2",value)
},(reason) => {
console.log("失败2")
})

(1.5)then 出错,状态改为 rejected

    const p = new Promise((resolve, reject) => {
        resolve()
    })
    const t = p.then((value) => {
        console.log("成功",value)
        // resolve(456); //这里会报错 error: resolve is not defined
        // return 123; // 使用return可以将t实例的状态改为fulfilled
        
        //如果代码出错,会将t的状态改为 rejected,上面调用 resolve() 方法一样报错。因为没有这个函数
        console.log(bbbbbbb)
    }, (reason) => {
        console.log("失败",reason)
    })

    t.then((value) => {
        console.log("成功2", value)
    }, (reason) => {
        console.log("失败2", reason)
    })

    console.dir(t) 

链式调用

因为 Promise.prototype.thenPromise.prototype.catch 方法返回promise 对象, 所以它们可以被链式调用。

(2)catch

  1. 当Promise的状态改为 rejcted 被执行

  2. 当Promise执行过程出现代码错误时,被执行

const p = new Promise((resolve, reject) => {
	// reject()
  // console.log(a)
  throw new Error("出错了");
})

// 思考: catch中的参数函数在什么时候被执行
//  1. 当Promise的状态改为rejcted.被执行
//  2. 当Promise执行过程出现代码错误时,被执行
p.catch((reason => {
	console.log("失败", reason)
})
console.log(p);

推荐使用方法

new Promise((resolve, reject) => {

        console.log("执行方法1")
        resolve("方法1成功了~~")

    }).then((value) => {

        console.warn("成功方法1", value)
        return new Promise((res, rej) => {
            console.log("执行方法2")
            res("方法2成功了~~")  // <----------------------------------- 执行 resolve
            // rej("方法2失败了~~")  // <-- reject
        });

    }, (reason) => {

        console.error("失败方法1", reason)

    }).then((value) => {
        console.warn("成功方法2", value)
        return new Promise((res, rej) => {
            console.log("执行方法3")
            res("方法3成功了~~")  // <-- resolve
        });

    }, (reason) => {

        console.error("失败方法2", reason)

    }).catch((error) => {

        console.error("报错了", error);

    })

如果方法2失败了

new Promise((resolve, reject) => {

        console.log("执行方法1")
        resolve("方法1成功了~~")

    }).then((value) => {

        console.warn("成功方法1", value)
        return new Promise((res, rej) => {
            console.log("执行方法2")
            // res("方法2成功了~~")  // <-- resolve
            rej("方法2失败了~~")  // <---------------------------------- 执行 reject
        });

    }, (reason) => {

        console.error("失败方法1", reason)

    }).then((value) => {
        console.warn("成功方法2", value)
        return new Promise((res, rej) => {
            console.log("执行方法3")
            res("方法3成功了~~")  // <-- resolve
        });

    }, (reason) => {

        console.error("失败方法2", reason)

    }).catch((error) => {

        console.error("报错了", error);

    })

参考

最好理解的Promise教程

使用 Promise | MDN

Promise | MDN

posted @ 2020-01-11 23:35  【唐】三三  阅读(185)  评论(0编辑  收藏  举报