首页 > 其他分享 >Promise基本用法

Promise基本用法

时间:2023-04-18 10:47:27浏览次数:31  
标签:基本 function console 异步 request 用法 xhr Promise

Promise是ES6的新特性,是异步编程的一种解决方案
从语法上说,Promise是一个对象,从它可以获取异步操作的消息,可以解决回调地狱(回调地狱嵌套回调函数)
Promise的含义:本身不是异步,是封装异步操作容器,统一异步的标准
Promise对象的特点:对象的状态不受外界影响,一旦状态改变,就不会再变,任何时候都可以得到这个结果
一.前引

js中的异步操作有哪些

1 ajax请求  
2 var xhr = new XMLHttpRequest();
3 xhr.onreadystatechange=function(){}
4 xhr.addEventListener('readystatechange',function(){})
5 浏览器事件
6 ele.onclick=function(){}
7 定时
8 setTime(function(){
9 },1000);

 


2.回调函数

 1 函数的参数是另外一个函数 2 setTime(function(){ 3 },1000); 
二.Promise 的优缺点
优点:
1、将异步操作以同步操作的方式表达出来,避免层层嵌套回调函数
2、提供统一的操作接口,方便对异步操作的控制
缺点:
1、promise一旦建立,则不可取消
2、如果不设置回调函数,则会在promise内部抛出错误,不会反应到外部
3、当状态是pending是,无法判断当前状态(是异步刚刚开始执行还是即将完成了异步操作)
三.状态
1.pending 进行中,当异步操作执行中
2.resolve 操作成功状态
3.rejected 操作失败的状态
四.对原生ajax封装

 1   function aa(method='get',path='1.php'){
 2        return new Promise((f1,f2)=>{
 3            let request = new XMLHttpRequest();
 4            request.open(method,path);
 5            request.send();
 6            request.onreadystatechange=()=>{
 7                if(request.readyState ==4){
 8                    if(request.status ==200){
 9                        f1.call(null,request.responseText)
10                    }else{
11                        f2.call(undefined,request.status)
12                    }
13                }
14            }
15        })    
16    }
17     aa('get','1.php').then(function(da){
18          console.log(da)
19     }).then(function(da){
20          aa('get','2.php').then(function(da){
21              console.log(da)
22          })
23     })

 


五.Promise基本API
1.实例方法
1 .then() 得到异步任务正确的结果
2 .catch() 获取异常信息
3 .finally() 方法用于指定不管Promise对象最后状态如何,都会执行的操作
成功与否都会执行(不是正式标准)

 1  <script type="text/javascript">
 2     /*
 3       Promise常用API-实例方法
 4     */
 5     // console.dir(Promise);
 6     function foo() {
 7       return new Promise(function(resolve, reject){
 8         setTimeout(function(){
 9           // resolve(123);
10           reject('error');
11         }, 100);
12       })
13     }
14     // 两种写法是等效的
15     foo()
16       .then(function(data){
17         # 得到异步任务正确的结果
18         console.log(data)
19       },function(data){
20         # 获取异常信息
21         console.log(data)
22       })
23       # 成功与否都会执行(不是正式标准) 
24       .finally(function(){
25         console.log('finished')
26       });
27   </script>

 


2.静态方法
1 .all()

Promise.all方法接受一个数组作参数,数组中的对象(p1、p2、p3)均为promise实例(如果不是一个promise,该项会被用Promise.resolve转换为一个promise)。它的状态由这三个promise实例决定
2 .race()

Promise.race方法同样接受一个数组作参数。当p1, p2, p3中有一个实例的状态发生改变(变为fulfilled或rejected),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数

 1 <script type="text/javascript">
 2     /*
 3       Promise常用API-对象方法
 4     */
 5     // console.dir(Promise)
 6     function queryData(url) {
 7       return new Promise(function(resolve, reject){
 8         var xhr = new XMLHttpRequest();
 9         xhr.onreadystatechange = function(){
10           if(xhr.readyState != 4) return;
11           if(xhr.readyState == 4 && xhr.status == 200) {
12             // 处理正常的情况
13             resolve(xhr.responseText);
14           }else{
15             // 处理异常情况
16             reject('服务器错误');
17           }
18         };
19         xhr.open('get', url);
20         xhr.send(null);
21       });
22     }
23     var p1 = queryData('http://localhost:3000/a1');
24     var p2 = queryData('http://localhost:3000/a2');
25     var p3 = queryData('http://localhost:3000/a3');
26      Promise.all([p1,p2,p3]).then(function(result){
27        //   all 中的参数  [p1,p2,p3]   和 返回的结果一 一对应["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
28        console.log(result) //["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
29      })
30     Promise.race([p1,p2,p3]).then(function(result){
31       // 由于p1执行较快,Promise的then()将获得结果'P1'。p2,p3仍在继续执行,但执行结果将被丢弃。
32       console.log(result) // "HELLO TOM"
33     })
34   </script>

 

 


————————————————
原文链接:https://blog.csdn.net/qq_50384924/article/details/117521833

标签:基本,function,console,异步,request,用法,xhr,Promise
From: https://www.cnblogs.com/watercaltrop/p/17328729.html

相关文章

  • MySQL导入导出 —— mysqldump 简介及常见用法
    一、导出导出用户需要有导出对象的权限,例如导出表要有select权限、导出视图要有showview权限、导出触发器要有trigger权限、需要锁表时要有locktables权限等。如果dump文件中包含了GTID信息,则无法导入到未启用GTID的数据库(低于5.6.9版本的数据库不支持GTID,因此也无法导入到这些......
  • vue常用组件之confirm用法及说明
    vue常用组件之confirm用法及说明原文链接:https://www.jb51.net/article/263587.htm+目录vue组件之confirmvue自定义confirm弹窗(全局组件)全局组件方式vue组件之confirm一些自带的方法,比如alert,confirm等,往往由于浏览器不同而展现出不同的样式,为了统一,我们可以自己实现简单封装,......
  • DBus API的使用(讲的很清晰,底层概念,基本api)
    DBus是用来进行进程间通信的。下面这张图展示了一些DBus的大部分东西,但是它太复杂了:​DBus本身是构建在Socket机制之上。真正的通信还是由Socket来完成的。DBus则是在这之上,制定了一些通信的协议,并提供了更高一层的接口,以更方便应用程序之间进行数据的交互。在DBus的体系......
  • Vue3 ref函数处理基本类型或对象类型
    基本类型视频对象类型视频2.ref函数作用:定义一个响应式的数据语法:constxxx=ref(initValue)创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。JS中操作数据:xxx.value模板中读取数据:不需要.value,直接:<div>{{xxx}}</div>备注:接收的数据可以是:基本......
  • JS特殊用法
     --集合排序//排序//打印排序前集合console.log("排序前:"+data);for(vari=0;i<data[0].length;i++){ for(varj=0;j<data[0].length-1-i;j++){ //相邻元素两两对比,元素交换,大的元素交换到后面 if(data[1][j]+data[2][j]<data[1][j+1]+data[2][j+1]){// <为升序排列,降序请......
  • flask的sqlalchemy快速插入数据、scoped_session线程安全、基本的增删查改、一对多、
    今日内容sqlalchemy快速插入数据scoped_session线程安全基本的增删改查一对多多对多连表查询1sqlalchemy快速插入数据#sqlalchemy是什么ORM框架,跟其他web框架没有必然联系,可以独立使用#安装,快速使用,执行原生sql#创建表和删除表-不能创建......
  • 盘点Python内置函数sorted()高级用法实战
    今日鸡汤清川带长薄,车马去闲闲。大家好,我是Python进阶者。一、前言前几天在Python钻石交流群有个叫【emerson】的粉丝问了一个Python排序的问题,这里拿出来给大家分享下,一起学习下。其实这里【瑜亮老师】、【布达佩斯的永恒】等人讲了很多,只不过对于基础不太好的小伙伴们来说,还是有......
  • java基本内容
    字面量定义:数据在程序中的书写格式分类制表符:\t 无限循环for(;;){ System.out.println("");}​while(true){ System.out.println("");}​do{ System.out.println("");}while(true);跳转循环语句continue:结束本次循环,继续下次循环。break:结束整个循环。 方......
  • 盘点国内前端npm CDN替代方案,基本上可以替代unpkg、jsdelivr
    收集一波常见的加速NPM包的CDN,发现有些还是挺好用的,用来做博客或者网站加载NPM使用还是可以的。经典老牌的CDN加速unpkg.comcdn.jsdelivr.netfastly.jsdelivr.net使用方法:直接进官网,搜NPM包名使用。缺点:有时候不是很稳定,而且国内有些地方没法访问,jsdelivr曾经被用来结合......
  • 深度学习的基本原理和常用框架介绍
    深度学习是一种基于人工神经网络的机器学习方法,它可以从大量的数据中学习抽象和复杂的特征,从而实现各种智能任务,如图像识别、自然语言处理、语音识别等。深度学习的基本原理是利用多层的神经网络结构,通过前向传播和反向传播的算法,不断调整网络中的参数,使得网络的输出能够逼近或优......