复习之promis

promise完美的解决了地狱回调

promise的介绍

// promise 承诺
// Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

// 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。

// Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

Promise对象有以下两个特点
// 1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

// 2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为成功fulfilled和从pending变为失败的rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。

// 这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

// 许下承诺
// 承诺需要时间来见证 pending
// 承诺最后有了结果
// 兑现 resolve / fulfiled
// 违背 rejected
 
promise链式操作
 
. . . . 不停的点 链式操作
链式操作能够实现的根源在于 返回同类型的数据
 
promise的方法
 
// .then(成功的,失败的)
// .catch 捕获(失败)
// .finally 无论成功或者失败都会执行这个结果
 const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                const num = parseInt(Math.random() * 100);
                if (num % 2) {
                    resolve(num)
                } else {
                    reject(num)
                }
            }, 300)
        })
        p
            .then(
                data => {
                    console.log(data + '成功');  // 奇数
                }
            )
            .catch(
                err => {
                    console.log(err + '失败');
                }
            )
            .finally(
                () => {
                    console.log('无论成功或者失败我都会执行');
                }
            )

 

Promise.all([p1,p2,p3]) 都会返回promise
// 结果 3个承诺如果都兑现 新的promise的结果就是成功的 数组 是要都实现才行没有实现就会返回这个这个失败的结果给这个promise的作为结果
// 其中一个结果没有兑现 新的promise的结果就是这个失败的结果
 

// all 异步的 里面的请求时同时发送的 1s
// 但是依然可以顺序拿到结果
 function aa(url) {
            return new Promise((resolve, reject) => {
                ajax({
                    type: 'get',
                    dataType: '',
                    url,
                    success: data => {
                        resolve(data)
                    }
                })
            })
        }

        let res = '';
// all 异步的 里面的请求时同时发送的 1s

// 但是依然可以顺序拿到结果

 res = Promise.all([aa('../php/1.php'), aa('../php/2.php'), aa('../php/3.php')]);
        console.log(res);
        res.then(
            data => {
                console.log(data);
            }
        )
 // 其中一个结果没有兑现 新的promise的结果就是这个失败的结果
function aa(n) { return new Promise((resolve, reject) => { setTimeout(() => { const num = parseInt(Math.random() * 100); if (num % 2) { resolve(`第${n}次成功的生成了奇数:${num}`) } else { reject(`第${n}次失败的生成了偶数:${num}`) } }, 100) }) } let res = Promise.all([aa(1), aa(2), aa(3)]); res .then( data => { console.log(data); } ) .catch( err => { console.log(err); } )
Promise.race       
谁先取到数据 谁就作为新的promise的结果 不管是成功的还是失败的
  function aa(n) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    const num = parseInt(Math.random() * 100);
                    if (num % 2) {
                        resolve(`第${n}次成功的生成了奇数:${num}`)
                    } else {
                        reject(`第${n}次失败的生成了偶数:${num}`)
                    }
                }, 100)
            })
        }

        // race 比赛
        //   谁先取到数据  谁就作为新的promise的结果  不管是成功的还是失败的

        let res = Promise.race([aa(1), aa(2), aa(3)]);
        res
            .then(
                data => {
                    console.log(data);
                }
            )
            .catch(
                err => {
                    console.log(err);
                }
            )

 

 
 
posted @ 2021-08-22 13:33  JSkolo_yyds  阅读(98)  评论(0编辑  收藏  举报