深入解读Promise对象
promise对象初印象:
promise对象是异步编程的一种解决方案,传统的方法有回调函数和事件,promise对象是一个容器,保存着未来才会结束的事件的结果
promise对象有两个特点:
promise新建后就会立即执行:
     let promise = new Promise(function (resolve, reject) {
            console.log("promise");
            resolve("当前脚本所有同步任务执行完才会执行"); // resolve()将状态改为resolve,只有执行resolve()才会继续往下走,也就是调用then()
        });
        promise.then(function (value) {
            console.log(value);
        });
        console.log("顺序执行");
        // promise
        // 顺序执行
        // 当前脚本所有同步任务执行完才会执行
异步加载图:
     function loadImageAsync(url) {
            return new Promise((resolve, reject) => {
                var img = new Image();
                img.onload = function(){
                    resolve(img);
                }
                img.onerror = function(){
                    reject(new Error("Could not load image at"+url));
                }
                img.src = url;
            });
        }
        loadImageAsync("./2.png").then((value) => {
            document.body.appendChild(value);
            value.style.border = "solid 5px red";
        });
使用promise对象实现ajax操作:
    function getJson(url) {
            var promise = new Promise((resolve, reject) => {
                var xhr = new XMLHttpRequest();
                xhr.open("get", url, true);
                xhr.onreadystatechange = function () {
                    if (xhr.readyState !== 4) {
                        return;
                    }
                    if (this.status === 200) {
                        resolve(this.response);
                    }else{
                        reject(new Error(this.statusText));
                    }
                }
                xhr.send();
            });
            return promise;
        }
        getJson("a.txt").then((json) => {
            console.log(json);
        },(error) => {
            console.log("出错了");
        });
链式操作用法:
     function runAsync1(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步任务1执行完成");
                    resolve("数据1");
                },2000);
            });
        }
        function runAsync2(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步任务2执行完成");
                    resolve("数据2");
                },2000);
            });
        }
        function runAsync3(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步任务3执行完成");
                    resolve("数据3");
                },2000);
            });
        }
        runAsync1().then((data) => {
            console.log(data);
            return runAsync2();
        }).then((data) => {3
            console.log(data);
            return runAsync3();
        }).then((data) => {
            console.log(data);
        });
reject用法:
     function getNumber(){
            return new Promise((resolve,reject) => {
                // 做一些异步操作
                setTimeout(function(){
                    var num = Math.floor(Math.random() * 10);
                    if(num < 5){
                        resolve(num);
                    }else{
                        reject("数字太大了");
                    }
                },2000);
            });
        } 
        getNumber().then((value) => {
            console.log("resolve");
            console.log(value);
        },(error) => {
            console.log("reject");
            console.log(error);
        })
catch的用法1:代替then()中的第二个参数
     function getNumber() {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    var num = Math.floor(Math.random() * 10);
                    if (num < 5) {
                        resolve(num);
                    } else {
                        reject("数字太大了");
                    }
                });
            });
        }
        getNumber().then((value) => {
            console.log("resolve");
            console.log(value);
        }).catch((error) => {
            console.log("reject");
            console.log(error);
        }) 
catch的用法2:then()中的第一个参数中抛出异常,那么并不会报错卡死js,而跳到catch()中
    function getNumber() {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    var num = Math.floor(Math.random() * 10);
                    if (num < 5) {
                        resolve(num);
                    } else {
                        reject("数字太大了");
                    }
                });
            });
        }
        getNumber().then((value) => {
            console.log("resolve");
            console.log(value);
            console.log(someData);
        }).catch((error) => {
            console.log("reject");
            console.log(error);
        }) 
all的用法:
        function runAsync1(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作1完成");
                    resolve("data1");
                },2000);
            });
        }
        function runAsync2(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作2完成");
                    resolve("data2");
                },1000);
            });
        }
        function runAsync3(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作3完成");
                    resolve("data3");
                },3000);
            });
        }
        Promise.all([runAsync1(),runAsync2(),runAsync3()])
        .then((data) => {
            console.log(data);
        });
race的用法:
     function runAsync1(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作1完成");
                    resolve("data1");
                },1000);
            });
        }
        function runAsync2(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作2完成");
                    resolve("data2");
                },2000);
            });
        }
        function runAsync3(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    console.log("异步操作3完成");
                    resolve("data3");
                },3000);
            });
        }
        Promise.race([runAsync1(),runAsync2(),runAsync3()])
        .then((data) => {
            console.log(data);
        });
2.用race给某个异步请求设置超时时间,并且在超时后执行相应的操作:
function getImg(url){
            return new Promise((resolve,reject) => {
                var img = new Image();
                img.onload = function(){
                    resolve(img);
                }
                img.src = "2.png";
            });
        }
        function delayTime(){
            return new Promise((resolve,reject) => {
                setTimeout(function(){
                    reject("图片请求超时了");
                },5000);
            });
        }
        Promise.race([getImg(),delayTime()])
        .then((data) => {
            document.body.appendChild(data);
        }).catch((error) => {
            console.log(error);
        });
理解Promise.resolve():
Promise.resolve("data1").then((value) => {
            console.log(value);
});
理解Promise.reject():
Promise.reject(new Error("出错了")).then((value) => {
            console.log(value);
        }).catch((error) => {
            console.log(error);
});
每次调用then()和catch()都会返回一个新创建的promise对象:
案例一:
      var promise1 = new Promise((resolve,reject) => {
            var num = Math.floor(Math.random() * 10);
            if(num < 5){
                resolve(num);
            }else{
                reject("数字太大了");
            }
        });
        var promise2 = promise1.then((value) => {
            console.log(value);
        });
        var promise3 = promise2.catch((error) => {
            console.log(error);
        });
        console.log(promise1 !== promise2); // true
        console.log(promise1 !== promise3); // true
        console.log(promise2 !== promise3); // true 
案例二:
        var promise1 = new Promise((resolve,reject) => {
           resolve(1);
        });
        promise1.then((value) => {
            return value * 2;
        });
        promise1.then((value) => {
            return value * 2;
        });
        promise1.then((value) => {
            console.log("1" + value); //
        }); 
当一个promise对象变为成功状态时后面的promise对象并没有停运:
     function runAsync1() {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    console.log(1);
                    resolve(2);
                }, 500);
            });
        }
        function runAsync2() {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    console.log(3);
                    resolve(4);
                }, 1000);
            });
        }
        Promise.race([runAsync1(), runAsync2()]).then((value) => {
            console.log(value);
        }).catch((error) => {
            console.log(error);
        });
        //
        //
        //
注:
Promise.prototype.then() -> 返回Promise对象
Promise.prototype.catch() -> 返回Promise对象
Promise.prototype.finally() -> 返回Promise对象
Promise.all() -> 返回Promise实例
Promise.race() -> 返回Promise实例
Promise.resolve() -> 返回Promise对象
Promise.reject() -> 返回Promise对象
深入解读Promise对象的更多相关文章
- Promise对象解读
		
首先强调的是"Promise"是对象,也就是说与其他JavaScript对象的用法,没有什么两样:其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介.它使得异步操 ...
 - angular学习笔记(二十八-附2)-$http,$resource中的promise对象
		
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
 - ES6深入学习记录(二)promise对象相关
		
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...
 - es6中的promise对象
		
Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...
 - ES6的promise对象应该这样用
		
ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...
 - Angularjs promise对象解析
		
1.先来看一段Demo,看完这个demo你可以思考下如果使用$.ajax如何处理同样的逻辑,使用ng的promise有何优势? var ngApp=angular.module('ngApp',[]) ...
 - JavaScript异步编程(1)- ECMAScript 6的Promise对象
		
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
 - Promise对象
		
1.Promise思想:每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程.这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用. ...
 - angularJS中的Promise对象($q)的深入理解
		
原文链接:a better way to learn AngularJS - promises AngularJS通过内置的$q服务提供Promise编程模式.通过将异步函数注册到promise对象, ...
 
随机推荐
- servlet温习
			
servlet是Javaweb的核心,它实质上就是运行在服务器端的Java代码 1.简介 servlet是运行在服务器端的小程序,是sun公司提供的一套规范(接口),用来处理用户的请求,响应给浏览器的 ...
 - 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
			
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
 - MySQL高级知识(十二)——全局查询日志
			
前言:全局查询日志用于保存所有的sql执行记录,该功能主要用于测试环境,在生产环境中永远不要开启该功能. 1.如何开启 #1.通过my.cnf配置开启该功能. 注:对my.cnf文件配置后,需重启my ...
 - 网络协议  反扒机制  fidder 抓包工具
			
协议 http 协议: client 端 server 端交互的 一种形式 请求头信息: User-Agent: 情求载体的身份标识 connection: 'close' 连接状态 请求成功后 断开 ...
 - Hive数据仓库工具安装
			
一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...
 - Python之Requests库的异常
			
异常 说明 requests.ConnectionError 网络链接错误一场,如 ...
 - skip-thought vector 实现Sentence2vector
			
1.常见文本相似度计算方法 常见的短文本相似度计算方法目前有很多中,但这些短文本相似度计算方法都只是提取了短文本中的浅层特征,而无法提取短文本中的深层特征.目前常见的文本相似度计算方法有: 1)简单共 ...
 - 转://SQLNET.EXPIRE_TIME参数
			
DCD: Dead Connection Detection ,可以用于检测.标记僵死而没有断开会session,再由PMON进行清理,释放资源.开启DCD,只需要在服务端的sqlnet.ora文件中 ...
 - P1678 烦恼的高考志愿(二分)
			
emmmm,我感觉我在解题的过程中还是有点吃亏的,因为,我知道是二分,只是大概知道怎么分,没有管这道到底是需要怎样的二分.然后在题上卡了很久. 思路:要找到填报学校的录取线x和自己的分数y的绝对值最小 ...
 - 004_后端js编写工具
			
一.框架同事用的后端调试用的工具 google=>"webpack dev server" https://webpack.github.io/docs/webpack-de ...