promise

139 阅读2分钟

//  Promise  承诺   现在许下诺言,将来会知道结果(可能好,可能不好)

        //  语法

        //         参数是一个回调函数  ---一般写异步程序

        //              结果是好的,就调用函数的第一个参数(也是个函数),如果结果是不好的,就调用函数的第二个参数

        //  Promise 本身就是构造函数

        //      本身由两个属性  

        //          [[PromiseState]]  表示一种状态  pending  /fulfilled /rejected

        //              pending  承诺的过程

        //              假如兑现了承诺  就会变成fulfilled

        //              假如没有兑现承诺    就会变成rejected

        //          [[PromiseResult]]  表示结果的值---无论成功或者失败

        //  买彩票   双数中奖,单数不中

        const p1 = new Promise(function (resolve, reject) {

            setTimeout(() => {

                const n = parseInt(Math.random() * 100);

                if (n % 2 === 0) {

                    resolve(n)

                } else {

                    reject(n)

                }

            }, 1000)

        })

        // console.log(p);

// promise 本身的语法

        //          1 then 有两个参数,第一个参数为成功时候调用,第二个为失败时调用 ,对应上面的 resolve 和reject

        //          2 catch 只接受 失败

        //          3 finally  无论成功或者失败都会接受

        //          而且这三种方法都返回promise实例化对象,默认是自己

        const p2 = new Promise(function (resolve, reject) {

            setTimeout(() => {

                const n = parseInt(Math.random() * 100);

                if (n % 2 === 0) {

                    resolve(n)

                } else {

                    reject(n)

                }

            }, 1000)

        })

     p2.then(data => {

             console.log('中奖号码' + data);

         }, err => {

             console.log('没有中奖:' + err)

         })

        p1.then(data => {

            console.log('成功' + data);

        }).finally(() => {

            console.log('成功失败都会出来');

        }).catch(err => {

            console.log('失败' + err);

        })

        p2.catch(err => {

            console.log('失败' + err);

        }).finally(() => {

            console.log('成功失败都会出来');

        }).then(data => {

            console.log('成功' + data);

        })

        //    当直接判断为成功的时候,根本不会走catch方法,但是判断为失败的时候,会进入then方法,此时的then方法中只有正确的,所以结果是undefined

        // 放回的对象也可以不是自己,可以是其他的实例化对象,从而实现链式调用

        p1.then(data => {

            console.log('成功' + data);

            return p2

        }).then(data => {

            console.log('成功' + data);

        })

// promise 静态方法 all 和 race

        // all 当所有成功的时候才算成功,但是只要有一个失败,就返回失败的那个

        const res = Promise.all([p1, p2])

        console.log(res);  //此时的res为一个promise实例化对象

        res.then(data => {

            console.log(data);

        }).catch(err => {

            console.log(err);

        })

        //  race 全部promise比赛,谁先完成返回谁的结果 ,无论是成功还是失败

        const res2 = Promise.race([p1, p2])

        res2.then(data => {

            console.log(data);

        }).catch(err => {

            console.log(err);

        })

// promise 的快速创建

        // 快速创建成功promise

        const p4 = Promise.resolve(1)

        // 快速创建失败promise

        const p5 = Promise.reject(2)

// promise 本身是异步还是同步的?

        // promise本身是同步的,但是promise的方法是异步的

        // 建议promise里面写异步代码,但是也可以写同步代码

        const p = new Promise((resolve, reject) => {

            console.log(2);  // 会直接打印

            setTimeout(() => {

                const n = parseInt(Math.random() * 100);

                if (n % 2 === 0) {

                    resolve(n)

                } else {

                    reject(n)

                }

            }, 1000)

        })

        p

            .then(

                data => {

                    console.log(data);

                }

            )

            .catch(

                err => {

                    console.log(err);

                }

            )