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则 变为已处理( ...
随机推荐
- Unix、Windows、Mac OS、Linux系统故事
我们熟知的操作系统大概都是windows系列,近年来Apple的成功,让MacOS也逐渐走进普通用户.在服务器领域,恐怕Linux是无人不知无人不晓.他们都是操作系统,也在自己的领域里独领风骚.这都还 ...
- Unknown column 'user_uid' in 'field list' sql错误解决过程
在idea中运行一直有错,找了好多个地方都找不到,以为是我的字段名字写错了,然而都是对的. 把错误的这个字段删了再打一遍就好了,
- D. Concatenated Multiples(离线处理)
思路:直接离线处理出每个ai 的10倍, 100倍, 1000倍的mod k 后的数值的个数,使用map<int,int >ss[12]存储, ss[x][y]表示 (ai*10x)%k= ...
- 好程序员web前端分享18个用CSS制作出来的东西
好程序员web前端分享18个用CSS制作出来的东西,与流行的看法相反,CSS不仅仅是用来提供一个WEB页面的基本风格,以使它看起来更有吸引力.还有很多其他的事情,CSS也可以做的很好.由于它创建动画和 ...
- Django视图(views)
1.FBV (基于函数的视图) 实例 url.py url(r'^add_publicer/',views.add_publicer) def add_publicer(request): if re ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- 【原创】微服务为什么一定要用docker
引言 早在2013年的时候,docker就已经发行,然而那会还是很少人了解docker.一直到2014年,Martin Fowler提出了微服务的概念,两个不相干的技术终于走在了一起,创造了今天的辉煌 ...
- Bootstrap开发框架界面的调整处理
我在之前介绍了很多关于Boostrap的框架方面的文章,主要是介绍各种插件的使用居多,不过有时候觉得基于Metronic的Boostrap框架的界面效果不够紧凑,希望对它进行一定的调整,那么我们应该如 ...
- H5 基于Web Storage 的客户端留言板
<!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku ...
- 一、rollup
参考:reduxreach-routerrollup-starter-librollup-starter-approller-clicreate-react-library 一.安装 npm inst ...