promise对象初印象:

promise对象是异步编程的一种解决方案,传统的方法有回调函数和事件,promise对象是一个容器,保存着未来才会结束的事件的结果

promise对象有两个特点:

1.promise对象的状态不受外界因素的影响,promise对象只有三种状态,Pending(进行中)、Resolve(已完成)、Reject(已失败),只有异步操作的结果才能决定是哪一种状态
2.一旦状态改变,就不会再发生变化,任何时候都可以得到这个结果,promise对象状态变化只有两种可能,从Pending->Resolve、Peding->Reject

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的用法:

all()接收一个数组作为参数,里面的值最终都返回一个Promise对象,提供了并行执行异步操作的能力,并且在所有异步操作执行完才执行回调,有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据,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的用法:

1.race()接收一个数组作为参数,里面的值最终都返回一个Promise对象,提供了并行执行异步操作的能力,race方法的效果是「谁跑的快,以谁为准执行回调」,这就是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()来创建promise对象,Promise.resolve()的返回值是promise对象
Promise.resolve("data1").then((value) => {
console.log(value);
});

理解Promise.reject():

使用Promise.reject()来创建promise对象,Promise.reject()的返回值是promise对象
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对象的更多相关文章

  1. Promise对象解读

    首先强调的是"Promise"是对象,也就是说与其他JavaScript对象的用法,没有什么两样:其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介.它使得异步操 ...

  2. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

  3. ES6深入学习记录(二)promise对象相关

    1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...

  4. es6中的promise对象

    Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...

  5. ES6的promise对象应该这样用

    ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...

  6. Angularjs promise对象解析

    1.先来看一段Demo,看完这个demo你可以思考下如果使用$.ajax如何处理同样的逻辑,使用ng的promise有何优势? var ngApp=angular.module('ngApp',[]) ...

  7. JavaScript异步编程(1)- ECMAScript 6的Promise对象

    JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...

  8. Promise对象

    1.Promise思想:每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程.这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用. ...

  9. angularJS中的Promise对象($q)的深入理解

    原文链接:a better way to learn AngularJS - promises AngularJS通过内置的$q服务提供Promise编程模式.通过将异步函数注册到promise对象, ...

随机推荐

  1. 转载:java中Thread.sleep()函数使用

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  2. Socket引子

    === ''' Socket网络编程: --应用层:http smtp dns ftp ssh snmp dhcp... 无论协议是什么本质上都是数据交换,总结为两种方式:收和发 --传输层(端口Po ...

  3. windows通过node环境搭建安装npm,cnpm,vue-cli

    1首先下载node,官网地址:https://nodejs.org/en/ 左边是稳定版,右边是最新版,安装过程一样,我选择的是稳定版. 按照步骤一步一步的安装就行,注意路径就可以了. 友情链接:ht ...

  4. VMware中某个虚拟机卡死,单独关闭某个虚拟机的办法

    在虚拟机中部署ceph时,其中一个虚拟机突然意外卡死,网络搜索到解决的办法,特此整理如下: 一.找到卡死虚拟机的安装目录,在安装目录下找到VMware这个文本文档 二.打开该文本文档,在文档中查找pi ...

  5. AttributeError: 'list' object has no attribute 'keys'

    #encoding=utf-8 import os result = {} if os.path.exists("test.txt"): day_file = open(" ...

  6. [matlab] 10.最小覆盖

    clear all; close all; clc; n=100; p=rand(n,2); p1=p(1,:); %取第一行的值 P1点 p2=p(2,:); %取第二行的值 P2点 r=sqrt( ...

  7. USB知识汇总

    概述 通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通 ...

  8. 史上最简单的springboot国际化多语言切换实现方案

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 前提: 在resources目录下建立 messages_en_US.properti ...

  9. 初学Python——列表生成式、生成器和迭代器

    一.列表生成式 假如现在有这样一个需求:快速生成一个列表[1,2,3,4,5,6,7,8,9,10],该如何实现? 在不知道列表生成式的情况下,可能会这样写: a=[1,2,3,4,5,6,7,8,9 ...

  10. 玄学bug(1)---注释里面的中文会报错

    有时候正常没有问题的程序会报错,可能跟注释里面的中文也有关系 with open('photo1.jpg','rb') as file: data = file.read() #print(data) ...