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则 变为已处理( ...
随机推荐
- c#实验一:基于winform的冒泡排序练习
一.界面设计 在排序前textbox中输入数字,以逗号隔开,通过两个button实现降序排序或升序排序,然后在排序后textbox中显示 三个关键点: 1.监测输入是否合法,最好使用正则表达式 2.拆 ...
- 清除被占用的8080端口,否则npm run dev无法正常运行
解决方案一: 1. 打开git-bash2. 输入:netstat -ano查看所有端口信息,如图,找到端口 8080,以及对应的 PID 3.输入:tskill PID 即可杀死进程 解决方案二: ...
- day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...
- loc iloc函数的区别
import pandas as pd data1 = pd.read_excel(r"G:\Python\example1.xlsx") loc 用行列标签,iloc用数字索引. ...
- sklearn.neural_network.MLPClassifier参数说明
目录 sklearn.neural_network.MLPClassifier sklearn.neural_network.MLPClassifier MLPClassifier(hidden_la ...
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)
译者:王亮作者:Polly 团队原文:http://t.cn/EhZ90oq声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实在不知道如 ...
- building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
Error msg: building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Ge ...
- 关于JAVA中string直接初始化赋值和new的区别,是否可以联系到int[]的情况
String str1 = "ABC"; String str2 = new String("ABC"); String str1 = “ABC”;可能创建一个 ...
- mysql监控每一条执行的sql语句
查看日志配置是否打开 SHOW VARIABLES LIKE "general_log%"; SET GLOBAL general_log = 'ON'; 打开日志 SET G ...
- win10启动nginx但是访问不了
首先验证配置,是否正常:nginx -t 我这里配置正常. 我的原因是设置了代理,打开IE浏览器,设置>Internet选项>连接>局域网设置>代理删除.