ES6学习笔记——promise

概述

Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)。

ES6中的promise对象, 可以将异步操作以同步的流程表达出来,很好地解决了回调地狱的问题(避免了层层嵌套的回调函数)

在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发

promise对象的3个状态

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

  • 成功状态:fullfilled

  • 失败状态:rejected

使用promise的基本步骤

(1)创建promise对象

(2)调用promise的回调函数then()

<script>
        //resolve-->解决问题-->事情(异步)成功完成
        //reject-->拒绝-->事情(异步)操作失败
        var p1 = new Promise(function(resolve,reject){
    
    
            //进来之后,状态为pending
            //开始执行异步操作(这里开始,写异步的代码,比如ajax请求 or 开启定时器)
            if(true){
    
    
                resolve('数据请求完成!');
                //如果请求成功了,请写resolve(),此时,promise的状态会被自动修改为fullfilled
            }else{
    
    
                reject('数据请求失败!');
                //如果请求失败了,请写reject(),此时,promise的状态会被自动修改为rejected
            }
            
        })

        console.log(p1);
        //调用promise的then()
        p1.then(function(res){
    
    
            console.log(res);//如果promise的状态为fullfilled,则执行这里的代码
        },function(err){
    
    
            console.log(err);//如果promise的状态为rejected,则执行这里的代码
        })

        p1.catch(function(err){
    
    
            console.log('catch:',err);//获取错误方法
        });

        //finally不传入参数,一般不用
        p1.finally(function(res){
    
    
            console.log('finally:',res);//
        })
    </script>

代码解释:

(1)当new Promise()执行之后,promise对象的状态会被初始化为pending,这个状态是初始化状态。new Promise()这行代码,括号里的内容是同步执行的。括号里定义一个function,function有两个参数:resolve和reject。如下:

  • 如果请求成功了,请写resolve(),此时,promise的状态会被自动修改为fullfilled。

  • 如果请求失败了,请写reject(),此时,promise的状态会被自动修改为rejected

(2)promise.then()方法,括号里面有两个参数,分别代表两个函数 function1 和 function2:

  • 如果promise的状态为fullfilled(意思是:如果请求成功),则执行function1里的内容

  • 如果promise的状态为rejected(意思是,如果请求失败),则执行function2里的内容

Ajax案例

httpUrl = 'https://news.topurl.cn/api';
            //var ajaxP = getAjax(httpUrl);
            //封装
            function getAjax(url) {
    
    
				return new Promise(function (resolve, reject) {
    
    
                    var httpUrl = url;
					//1.设置xhr
					var xhr = new XMLHttpRequest();
					//2.设置路径
					xhr.open("GET", httpUrl);
					//3.监听
					xhr.onreadystatechange = function () {
    
    
						if (xhr.status == 200 && xhr.readyState == 4) {
    
    
							//处理获取得到的数据
							resolve(xhr);
						} else if (xhr.readyState == 4 && xhr.status != 200) {
    
    
							//处理失败结果
							reject(xhr);
						}
					};
					//4.发送
					xhr.send();
				});
			};

            console.log(ajaxP);
            ajaxP.then(function(res){
    
    
                var result = JSON.parse(res.response);
                console.log(res);
                console.log(result);
            }).catch(function(err){
    
    
                console.log(err);
            })

实现上述功能还可以用原生封装好的ajax

//fetch为原生封装好的ajax
fetch(httpUrl).then(function(res){
    
    
                console.log(res);
                var result = res.json();
                result.then(function(result){
    
    
                    console.log(result);
                })              
            })

Promise的其他方法

Promise.all():

前面例子都是只有一个Promise,使用all()方法可以包装多个Promise实例。

语法:参数只有一个,可迭代对象,可以是数组,或者Symbol类型等

    Promise.all(iterable).then().catch()

Promise.race():

语法和all()一样,但是返回值有所不同,race根据传入的多个Promise实例,只要有一个实例resolve或者reject,就只返回该结果,其他实例不再执行

猜你喜欢

转载自blog.csdn.net/Nozomi0609/article/details/109405441