es6 promise 所见
一、Promise是什么?
- const request = url => {
- return new Promise((resolve, reject) => {
- $.get(url, data => {
- resolve(data)
- });
- })
- };
- // 请求data1
- request(url).then(data1 => {
- return request(data1.url);
- }).then(data2 => {
- return request(data2.url);
- }).then(data3 => {
- console.log(data3);
- }).catch(err => throw new Error(err));
promise是用来解决两个问题的:
- 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
- promise可以支持多个并发的请求,获取并发请求中的数据
- 这个promise可以解决异步的问题,本身不能说promise是异步的
promise的三种状态
- var p1 = new Promise(function(resolve,reject){
- resolve(1);
- });
- var p2 = new Promise(function(resolve,reject){
- setTimeout(function(){
- resolve(2);
- }, 500);
- });
- var p3 = new Promise(function(resolve,reject){
- setTimeout(function(){
- reject(3);
- }, 500);
- });
- console.log(p1);
- console.log(p2);
- console.log(p3);
- setTimeout(function(){
- console.log(p2);
- }, 1000);
- setTimeout(function(){
- console.log(p3);
- }, 1000);
- p1.then(function(value){
- console.log(value);
- });
- p2.then(function(value){
- console.log(value);
- });
- p3.catch(function(err){
- console.log(err);
- });
控制台输出:
- Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 1}
- Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
- Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
- 1
- 2
- 3
- Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 2}
- Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}
二、es6 promise用法大全
Promise是一个构造函数,自己身上有 all, reject, resolve 这几个眼熟的方法,原型上有 then, catch 等方法。
- let p = new Promise((resolve, reject) => {
- //做一些异步操作
- setTimeout(() => {
- console.log('执行完成');
- resolve('我是成功!!');
- }, 2000);
- });
- resolve :异步操作执行成功后的回调函数
- reject:异步操作执行失败后的回调函数
then 链式操作的用法
所以,从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:
- p.then( (data) => {
- console.log(data);
- })
- .then( (data) => {
- console.log(data);
- })
- .then( (data) => {
- console.log(data);
- });
reject的用法 :
把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。
- let p = new Promise((resolve, reject) => {
- //做一些异步操作
- setTimeout(function(){
- var num = Math.ceil(Math.random()*10); //生成1-10的随机数
- if(num<=5){
- resolve(num);
- }
- else{
- reject('数字太大了');
- }
- }, 2000);
- });
- p.then((data) => {
- console.log('resolved',data);
- },(err) => {
- console.log('rejected',err);
- }
- );
catch的用法
我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?
其实它和then的第二个参数一样,用来指定reject的回调。用法是这样:
- p.then( (data) => {
- console.log('resolved' , data)
- }). catch( (err) => {
- console.log('rejected' , err)
- })
效果和写在then的第二个参数里面一样,不过它还有第二个作用: 在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常(代码出错了),那么并不会报错卡死js,而是会进入到这个catch方法中。
- p.then( (data) => {
- console.log('resolved', data);
- console.log(somedata);//此处的somedata的定义
- })
- .catch( (err) => {
- console.log('rejected', err)
- })
在resolve的回调中,我们console.log(somedata);而somedata这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到这样的结果:
也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了,这与我们的try/catch语句有相同的功能
all的用法:谁跑的慢,以谁为准执行回调。
all接收一个数组参数,里面的值最终都算返回Promise对象
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完成才执行回调。
看下面的例子:
- let Promise1 = new Promise( function(resolve, reject) { });
- let Promise2 = new Promise( function(resolve, reject) { });
- let Promise3 = new Promise( function(resolve, reject) { });
- let p = Promise.all( [Promise1, Promise2, Promise3] )
- p.then(function() {
- //三个都成功则成功
- },{
- //只要有失败,则失败
- })
race的用法:谁跑的快,以谁为准执行回调
race的使用场景:比如我们可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作,代码如下:
- //请求某个图片资源
- function requestImg(){
- var p = new Promise( (resolve, reject) => {
- img.onload = function(){
- resolve(img);
- }
- img.src = '图片的路径';
- });
- return p;
- }
- //延时函数,用于给请求计时
- function timeout() {
- var p = new Promise( (resolve, reject) => {
- setTimeout( () => {
- reject('图片请求超时');
- },5000)
- });
- return p;
- }
- Promise.race([requestImg(), timeout()].then( (data) =>{
- console.log(data);
- }).catch( (err) => {
- console.log(err);
- })
- )
es6 promise 所见的更多相关文章
- Es6 Promise 用法详解
Promise是什么?? 打印出来看看 console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...
- 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...
- ES6 Promise 接口
构造函数 new Promise(function(resolve, reject){}); 构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用.函数的两个 ...
- ES6 Promise 全面总结
转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...
- ES6 Promise 异步操作
最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...
- 微信小程序Http高级封装 es6 promise
公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是 数据请求! 看了下小程序的请求方式大概和a ...
- 解析ES6 Promise
ES6 Promise 概念之类的,大概读者都应该有所知道,接下来我们直入终点. 先让我们来看看什么是Promise吧,他是一个object,类,arry,function? 首先,学习它的时候应该讲 ...
- jquery Promise和ES6 Promise的区别
1. Deferred对象有resolve和reject方法,可以直接修改状态 jquery用Deferred实现了Promise规范,Deferred与ES6 Promise的最大区别是: Defe ...
- ES6 Promise对象then方法链式调用
then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...
随机推荐
- Jmeter在Http Rest接口中自动生成签名(Json格式请求参数)
第一步: 签名的java类生成jar包,导入到jmeter的lib目录下(依赖的第三方包也要导入) 第二步:编写jmeter脚本,这里使用BeanShell 进行签名串的生成,目录结构如下: Bean ...
- 【笔试题】Java final keyword
Java 知识测试 Java final keyword Question 1 What is the use of final keyword in Java? A. When a class is ...
- [.Net] 什么是线程安全的并发集合
System.Collections.Concurrent 为此,在.NET Framework中提供了System.Collections.Concurrent新的命名空间可以访问用于解决线程安全问 ...
- SGU 126. Boxes --- 模拟
<传送门> 126. Boxes time limit per test: 0.25 sec. memory limit per test: 4096 KB There are two b ...
- was unable to refresh its cache! status = Cannot execute request on any known server
出现这种错误是因为: Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为. 在 yml中设置 eureka.client.register-with-eu ...
- springboot异步线程
前言 最近项目中出现了一个问题,发现自己的定时器任务在线上没有执行,但是在线下测试时却能执行,最后谷歌到了这篇文章SpringBoot踩坑日记-定时任务不定时了?; 本篇文章主要以自己在项目中遇到的问 ...
- C++自主测试题目
下面是题目 后面有代码 1.键盘输入3个整数a,b,c值,求一元二次方程a*X∧2+b*X+c=0(a≠0)的根,结果保留两位小树. 2.编写一个口令输入程序,让用户不停输入口令,直到输对为止,假设口 ...
- HTML table 表格边框
一.总体思路: 1.表格无边框,背景颜色设置一种颜色(#DCDFE6),这样表格的边框的颜色就是表格的背景颜色: 2.单元格间距为1px,背景颜色设置为白色(#FFFFFF) // CSS table ...
- python教程:用简单的Python编写Web应用程序
python现在已经成为很多程序员关注的编程语言之一,很多程序员也都开始弄python编程,并且很多时候都会用自己的操作来选择,而现在不管是程序员还是少儿编程,都会有python这门课,今天就和大家分 ...
- [BZOJ3230]相似子串(后缀数组)
显然可以通过后缀数组快速找到询问的两个串分别是什么,然后正反各建一个后缀数组来求两个串的LCP和LCS即可. #include<cstdio> #include<cstring> ...