Promise核心基础
基础
Promise
- 抽象表达:是js中进行异步编程的新的解决方案
- 具体解释:1、从语法上来说是一个构造函数 2、从功能上来说promise对象用来封装一个异步操作并可以获取其结果
- 状态改变:0、new实例为pending(未知)状态 1、pending变为resolved(成功) 2、pending变为rejected(失败)
一个promise对象只能改变一次,成功结果数据一般为value,失败结果数据一般为reason
示例代码
const p1 = new Promise
(
function(resolve, reject) // 这里的参数为两个处理函数,该函数称为执行器函数(执行异步任务),该函数为同步回调
{
setTimeout
(
function()
{
if(Date.now() % 2 === 0)
{
resolve('成功的数据!');
}
else
{
reject('失败的数据!');
}
},1000
)
}
)
基本使用
var x;
function fun1()
{
return new Promise
(
function(resolve, reject)
{
// 模拟异步任务
setTimeout
(
function()
{
console.log('get data successfully'); // 完成数据的接收,并将其处理抛出
resolve('datax');
},2000
)
}
)
}
fun1().then( (value) => { x = value; console.log(x); } ); // 在回调函数内部将数据输出
// 语法糖
const p1 = Promise.resolve(1); // 构建一个产生一个成功数据为1的promise对象
const p2 = Promise.reject(0); // 构建一个产生一个失败数据为0的promise对象
p1.then( (value) => { console.log(value); } );
p2.catch( (reason) => { console.log(reason); } );
// Promise.all
const allP = Promise.all([p1, p2]); // 参数为一个包含promise对象的数据
// 对象数组中有一个promise对象返回错误就会得到错误结果,成功的数据将返回一个数组保存(顺序按照对象数组内的顺序)
allP.then( value => { console.log('onResolved') } ).catch( reason => { console.log('onRejected', reason) } );
// Promise.race 了解(结果为第一个完成的promise实例对象的结果)
Promise.race([p2, p1]).then( value => { console.log('111') } ).catch( reason => { console.log('000') } );
关键问题
- promise实例对象返回的新promise的结果由指定的对应的回调函数的执行结果来决定
- 详细解释:
- 如果抛出异常,新的promise状态为rejected,reason为抛出的异常
- 如果返回值为任意非promise的值,新的promise状态变为resolved,value的值为返回的值
- 若返回值为一个新的promise,则该promise的结果就会称为新promise的结果
- 详细解释:
代码示例
new Promise
(
function(resolve, reject)
{
resolve('正确的输出结果');
}
).then(value => {console.log('value1', value); return 111;}, reason => {console.log('reason1', reason)}).then(value => {console.log('value2', value)}, reason => {console.log('reason1', reason)});
关键问题2
成功或者失败的回调是异步的
执行器函数内部的内容是同步执行(关键!)
代码示例
new Promise(
function(resolve, reject){
setTimeout(
function(){
resolve('成功返回的数据');
console.log('这是resolve语句后的内容');
}
)
}
).then(value => {console.log(value)}).catch(reason => {console.log(reason)});
异常穿透
示例代码
new Promise
(
function(resolve, reject)
{
reject('onRejected');
}
).then
(
value => { console.log('value1', value) },
// reason => { console.log('reason1', reason) } // 若不传入失败的回调函数,相当于 reason => {throw reason}
).then
(
value => { console.log('value2', value) },
// reason => { console.log('reason1', reason) }
).then
(
value => { console.log('value3', value) },
// reason => { console.log('reason1', reason) }
).catch
(
reason => { console.log('reason', reason); return new Promise( ()=>{} ); } // 返回一个pending状态的promise实例对象终止链式调用
).then
(
value => { console.log('value4', value) },
reason => { console.log('reason4', reason) }
)
宏队列与微队列(补充)
- 宏队列:dom事件回调、ajax回调、定时器回调
- 微队列:promise回调、mutation回调
- 注意!:在执行每个宏任务前,都要将微任务执行完
示例代码
setTimeout(function(){
console.log('延迟定时器1');
Promise.resolve('promise3').then(value => {console.log(value)});
},0);
setTimeout(function(){
console.log('延迟定时器2');
},0);
Promise.resolve('promise1').then(value => {console.log(value)});
Promise.resolve('promise2').then(value => {console.log(value)});
Promise核心基础的更多相关文章
- Androd核心基础01
Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...
- css核心基础总结篇
今日这篇是整合前面的css补充知识的. 我觉得前面的关于css的知识补充进去有点乱,今日整理整理一下. 层叠样式表 层叠是什么意思?为什么这个词如此重要,以至于要出现在它的名称里. 层叠可以简单地理解 ...
- Android应用的核心基础
Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...
- C#核心基础--类(2)
C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...
- (1) css的核心基础
css的核心基础 1.css的基本语法在具体使用css之前,请各位兄弟姐妹先思考一个生活中的问题,一般情况下我们是如何描述一个人的呢? 小明{ 民族:汉族: 性格:温柔: 性别:男: 体重:68kg ...
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)
初学JavaWeb开发,请远离各种框架,从Servlet开始. Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的, ...
- CSS 设计彻底研究(一)(X)HTML与CSS核心基础
第1章 (X)HTML与CSS核心基础 这一章重点介绍了4个方面的问题.先介绍了 HTML和XHTML的发展历程以及需要注意的问题,然后介绍了如何将CSS引入HTML,接着讲解了CSS的各种选择器,及 ...
- JavaScript编程:javaScript核心基础语法
1.javaScript核心基础语法: javaScript技术体系包含了5个内容: 1.核心语言定义: 2.原生对象和雷子对象: 3.浏览器对象 ...
- 一个都不能少: DevOps的3大核心基础架构
DevOps的涵盖面非常广,因为这个概念的火热,又有很多文章和技术都在把DevOps的帽子扣在自己头上,让很多人迷惑不解.其实,DevOps的知识体系如果从顶层上来分解,只有2块:方法论和工具链.方法 ...
随机推荐
- GAN网络从入门教程(二)之GAN原理
在一篇博客GAN网络从入门教程(一)之GAN网络介绍中,简单的对GAN网络进行了一些介绍,介绍了其是什么,然后大概的流程是什么. 在这篇博客中,主要是介绍其数学公式,以及其算法流程.当然数学公式只是简 ...
- mongodb安装与mongo vue的使用
首先,下载mongodb,然后安装 http://downloads.mongodb.com/win32/mongodb-win32-x86_64-enterprise-windows-64-2.6. ...
- locust接口压测
前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...
- VS2019无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了。
解决方法:
- scala 数据结构(一):数据结构简介
1 数据结构特点 scala集合基本介绍 1)Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问 2)两个主要的包: 不可变集合:scala.collection.immutable ...
- linux专题(二):走近Linux系统 (2020-04-08 10:08)
http://dwz.date/UDf 走近Linux系统 开机登录 开机会启动许多程序.它们在Windows叫做"服务"(service),在Linux就叫做"守护进程 ...
- day1 python计算器底层运作,注释及变量
每日一记 utf-8 国际标准编码(可变长的unicode编码)中文3字节,英文数字特殊字符1字节 gbk 中国标准编码 中文2字节,英文数字特殊字符1字节 1.原码,反码,补码 "&quo ...
- 小白从零开始阿里云部署react项目+node服务接口(一:阿里云服务器)
准备阿里云服务器,并安装系统 如果没用自己服务器可以购买一个 https://www.aliyun.com/minisite/goods?userCode=x7i5glgc 初级购买一个1核2G的主机 ...
- Zabbix4.x如何安全传输数据
由于设备都在混合云,所以不少数据传输是通过公网,这样极大的增加了危险性,所以在Zabbix数据传输这块则进行PSK安全认证,由proxy主动收集agent数据后统一发送给server,这样只需要对pr ...
- 抽象工厂模式(c++实现)
抽象工厂模式 目录 抽象工厂模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 感悟 模式定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而 ...