深入解读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对象, ...
随机推荐
- SAP S/4嵌入式分析——虚拟数据模型(VDM)
在本文中,我会通过CDS视图来介绍虚拟数据模型(Virtual Data Model,以下简称VDM). 在SAP HANA平台出现后,SAP的业务应用开发模式已经产生了变化,新的经验法则是:尽可能在 ...
- sqlSugar的使用---入门
一,新建.net core web项目 二. 项目引入包:sqlSugarCore 三.创建两个表:user, department 四. 新建model(不一定需要与table相同,使用[S ...
- WPF画图の利用Path画扇形(仅图形)
一.画弧 Path继承自Sharp,以System.Windows.Shapes.Shape为基类,它是一个具有各种方法的控件. 我们先看一段xaml代码: <Path Stroke=" ...
- WPF 使用Console.Write打印信息到控制台窗口中
WPF中使用Console.Write函数来打印信息是没有意义的,因为并没有给其输出字符的窗口.对于桌面程序来说,这是十分合理的,然而有时为了方便调试,在程序编写过程中打印出信息给程序员看还是必要的, ...
- SQlite源码分析-体系结构
体系结构 在内部,SQLite由以下几个组件组成:内核.SQL编译器.后端以及附件.SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展SQLite的内核变得更加方便.所有SQL ...
- SDOI2014 R1做题笔记
SDOI2014 R1做题笔记 经过很久很久的时间,shzr又做完了SDOI2014一轮的题目. 但是我不想写做题笔记(
- [ZJOI2012]灾难
嘟嘟嘟 偶尔翻到的一道题. 50分暴力很好想,对于每一个点进行一次拓扑排序,然后每一次别memset,只清空走过的点,能拿到70分. 正解好像也挺好想,是一个叫"灭绝树"的东西. ...
- 009_一行python重要工具
一.一行启动httpserver 你可以先登录容器(webssh),然后(注意必须是在/data/log/debug/pprof/目录) 例如生成 jvm dump文件 jmap -dump:form ...
- Golang 爬虫-广度优先(获取html文档中的超链接)
package main import( "fmt" "net/http" "io/ioutil" "regexp" & ...
- Java NIO2:NIO概述
一.概述 从JDK1.4开始,Java提供了一系列改进的输入/输出处理的新特性,被统称为NIO(即New I/O).新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原j ...