Promise异步操作
Promise是es6中新增加的类(new Promise),目的为了管理JS中异步编程,也叫“Promise”设计模式
Promise用来解决异步问题。本身是同步的,只是用来管理异步编程的一种模式
所谓Promise,简单说就是一个容器(壳子),里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果
promise对象是一个构造函数,本身有resolve、reject、all方法,原型上有then、catch等方法
三种状态
- pending 准备状态
- fulfilled 成功状态(resolve)
- rejected 失败状态(reject)
最终只有两个状态,1、准备 2、成功或者失败
let p = new Promise((resolve,reject)=>{
setTimeout(function(){
let txt = '呼伦贝尔';
resolve(txt)//resolve时候执行成功的 呼伦贝尔
//reject(err) //reject时候执行失败的 err
},1000)
});
p.then((data)=>{
console.log(data);
},(err)=>{
console.log('err')
})
/*
1、异步操作放在Promise传的函数里面
2、Promise的参数与 then的参数相对应
*/
Promise对象的特点
- Promise对象的状态不受外界影响。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
- 一旦状态改变,就不会再变。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected
promise中excutor执行器,默认new时候会立即调用
每一个promise的实例上都有一个then方法,用来指定resolved和rejected状态的回调函数
其中then方法可以写多个链式调用(前提需要保证执行完then返回的依然是promise实例)
let pro = new Promise((resolve,reject) =>{
//执行一个异步操作
let xhr = new XMLHttpRequset();
xhr.open('get','1.js',true);
xhr.onreadyStatechange() = function(){
if(xhr.readyState === 4 && xhr.status === 200){
val = xhr.responseText;
resolve(val);//成功
}
if(xhr.status!==200){
reject();//失败
}
}
xhr.send();
})
pro.then((resolve)=>{
console.log('ok');
//数据绑定
},(reject)=>{
console.log('error');
}).then(()=>{
//当第一个then中的函数执行完,会执行第二个
}).then(()=>{
//当第二个then中的函数执行完,会执行第三个
})
promise支持多个并发的请求,获取并发中的数据
Promise请求过来的数据,可能是null,也可能是数组,是数组就进then()遍历,返回的null不需要then()
promise.prototype.catch()
该方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数
getJSON('/bosh.json').then(function(bosh){
//...
}).catch(function(err){
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
})
一般来说,不要在then方法里面定义reject 状态的回调函数(即then的第二个参数)
也就是在then里面执行成功信息,在catch里面执行错误信息
// 不推荐
promise
.then(function(data) {
// success
}, function(err) {
// error
}); // 推荐
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
promise.all
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。返回的每个成员都是 Promise 实例
等待所有的promise都成功执行then,反之只要有一个失败就会执行catch
Promise.all([p1,...]).then();
Promise异步操作的更多相关文章
- ES6 Promise 异步操作
最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...
- promise实现原理
先看的这篇有问题的文章 花了很长时间研究这篇文章,卡在实现串行Promise那儿了,一直看不明白.就在刚才,发现这篇文章是错的,在第一次用setTimeout( ,0)那儿就错了.虽然用setTime ...
- 手把手教你实现一个完整的 Promise
用过 Promise,但是总是有点似懂非懂的感觉,也看过很多文章,还是搞不懂 Promise的 实现原理,后面自己边看文章,边调试代码,终于慢慢的有感觉了,下面就按自己的理解来实现一个 Promise ...
- Promise和异步编程
前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编 ...
- 对于ES6中Promise的个人见解
1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...
- promise应用及原生实现promise模型
一.先看一个应用场景 发送一个请求获得用户id, 然后根据所获得的用户id去执行另外处理.当然这里我们完全可以使用回调,即在请求成功之后执行callback; 但是如果又添加需求呢?比如获得用户id之 ...
- 30分钟,让你彻底明白Promise原理
前言 前一阵子记录了promise的一些常规用法,这篇文章再深入一个层次,来分析分析promise的这种规则机制是如何实现的.ps:本文适合已经对promise的用法有所了解的人阅读,如果对其用法还不 ...
- 初步认识Promise
在解释什么是Promise之前,先看一道练习题,做完练习题也就知道Promise到底是干嘛用的了. 假设现在有个需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返 ...
- promise的生命周期
每个promise都会经历一个短暂的生命周期: 先是处于进行中(pending)状态,此时操作并未完成,所以他也是未处理的(unsettled): 一旦异步惭怍执行结束,promise则 变为已处理( ...
随机推荐
- java 非访问修饰符 final 的用法
final 修饰符,用来修饰类.方法和变量 final修饰的类不能被继承 举例,String类是final类,不可以被继承: final修饰的方法不能被重写 只是不能重写,也就是不能被子类修改,但是可 ...
- 【Teradata Utility】使用SQL Assistant导出导入数据
1.导出 (1)选择菜单栏File,点击Export Results,输入导出数据的SQL: select * from etl_data.soure_table; (2)选择导出数据格式为txt或h ...
- Java 8 中为什么要引出default方法
(原) default方法是java 8中新引入进的,它充许接口中除了有抽象方法以外,还可以拥用具有实现体的方法,这一点跟jdk8之前的版本已经完全不一样了,为什么要这样做呢? 拿List接口举例,在 ...
- Netstat 常用命令--备忘录
Netstat 用于显示与IP .TCP .UDP 和ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况. 常用参数 -a (all)显示所有选项,默认不显示LISTEN相关-t (t ...
- 利用SQL注入漏洞登录后台
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询 ...
- Spring Security(三十五):Part III. Testing
This section describes the testing support provided by Spring Security. 本节介绍Spring Security提供的测试支持. ...
- ARC089E GraphXY 构造
传送门 在Luogu上评了"NOI"之后评级变成了"普及+/提高"--我觉得我可能要退群了 考虑构造一个这样的图: 其中上半部分是从\(S\)开始的一条长\(1 ...
- Dubbo-Zookeeper安装
安装zookeeper: 1.拖入tar.gz包,解压 2.建立/usr/zookeeper路径,该路径创建logs文件夹和data文件夹 3.进入conf目录,复制一份zoo_sample.cfg为 ...
- elementUi源码解析(1)--项目结构篇
因为在忙其他事情好久没有更新iview的源码,也是因为后面的一些组件有点复杂在考虑用什么方式把复杂的功能逻辑简单的展示出来,还没想到方法,突然想到element的组件基本也差不多,内部功能的逻辑也差不 ...
- TypeError: argument to reversed() must be a sequence ERROR basehttp 124 "GET /admin/ HTTP/1.1" 500 114103 Performing system checks...
Error Msg TypeError: argument to reversed() must be a sequence ERROR basehttp 124 "GET /admin/ ...