Promise


Promise是什么?

1、主要用于异步计算

2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

3、可以在对象之间传递和操作promise,帮助我们处理队列

为什么会有Promise?

同步:一个任务执行完毕才会执行下一个任务

异步:可以将A任务交付给系统,继续做下一个任务 再通过回调函数 继续做A剩余任务, AB工作的顺序 和 时间顺序无关 所以叫“异步”。

Promise的作用

1,主要是用来解决回调嵌套(执行完后再去执行某一些操作,这时候容易形成嵌套再嵌套的问题)的问题,也就是常见的"回调地狱";

 2,执行多并发请求获取数据;

Promise的使用:

(1)使用new实例化一个Promise对象,Promise的构造函数中传递一个参数。这个参数是一个函数,该函数用于处理异步任务。

(2)并且传入两个参数:resolve和reject,分别表示异步执行成功后的回调函数和异步执行失败后的回调函数;

(3)通过 promise.then() 处理返回结果。这里的 p 指的是 Promise实例。

 // 第一步:model层的接口封装

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

            // 这里做异步任务(比如ajax 请求接口。这里暂时用定时器代替)

            setTimeout(function () {

                var data = { retCode: 0, msg: 'hello' }; // 接口返回的数据

                if (data.retCode == 0) {

                    // 接口请求成功时调用

                    resolve(data);

                } else {

                    // 接口请求失败时调用

                    reject({ retCode: -1, msg: 'network error' });

                }

            }, 100);

        });

        // 第二步:业务层的接口调用。这里的 data 就是 从 resolve 和 reject 传过来的,也就是从接口拿到的数据

        promise.then(data => {

            // 从 resolve 获取正常结果

            console.log(data);

        }).catch(data => {

            // 从 reject 获取异常结果

            console.log(data);


promise对象的3个状态

初始化状态(等待状态):pending

成功状态:fullfilled

失败状态:rejected

promise 的基本用法

 let promise = new Promise((resolve, reject) => {

            resolve()

        }).then(res => { console.log(res) })//undefined

Promise构造函数接收一共函数作为参数,该函数有两个参数分别为resolve和reject,调用resolve则会代表成功,调用reject则会代表失败。

then 方法

function greet() {

            let promise = new Promise((resolve, reject) => {

                let data = 'hello world'

                resolve(data)

            })

            return promise

        } greet().then(res => { console.log(res) })//hello world

then方法是处理resolve和reject的回调,分别有两个参数,参数分别是(resolve)=>{},(reject)=>{}。then方法的返回值也是一个promise,因此可以不断的进行链式调用then方法。

all方法

Promise的all方法提供了并行执行异步操作的能力,它可以将promise数组作为参数,只有当时所有promise都成功后,才会获取到成功结果,否则会报错。

   function p1() {

            var promise1 = new Promise(function (resolve, reject) {

                console.log("p1的第一条输出语句");

                resolve("p1完成");

            })

            return promise1;

        }

        function p2() {

            var promise2 = new Promise(function (resolve, reject) {

                console.log("p2的第一条输出语句");

                resolve("p2完成");

            })

            return promise2;

        }

        function p3() {

            var promise3 = new Promise(function (resolve, reject) {

                console.log("p3的第一条输出语句");

                resolve("p3完成")

            });

            return promise3;

        }

        Promise.all([p1(), p2(), p3()]).then(function (data) {

            console.log(data);

        }) 

打印结果:

p1的第一条输出语句

p2的第一条输出语句

p3的第一条输出语句

['p1完成','p2完成','p3完成']

race方法

在all中的回调函数中,等到所有的Promise都执行完,再来执行回调函数,race则不同它等到第一个Promise改变状态就开始执行回调函数。

let P1 = new Promise(resolve => {

            setInterval(() => {

                resolve("I\'m P1");

            }, 1000)

        });

        let P2 = new Promise(resolve => {

            setInterval(() => {

                resolve("I\'m P2");

            }, 1500)

        });

        Promise.race([P1, P2])

            .then(value => {

                console.log(value)

            })

        console.log('value')//value 与Promise是一起执行的,没有时间先后顺序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容