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块:方法论和工具链.方法 ...
随机推荐
- 每日一题 - 剑指 Offer 32 - II. 从上到下打印二叉树 II
题目信息 时间: 2019-06-25 题目链接:Leetcode tag: 队列 BFS 难易程度:简单 题目描述: 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 示 ...
- css3动画添加间隔
因项目需要,需要在元素上实现动画效果,并且需要有动画间隔.坑爹的是animation-delay只有在第一次动画开始的时候才起效. 在网上找了很多方法,最终的方法基本都是改动画规则,比如 @keyfr ...
- MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...
- day11 文件操作(上)
目录 一.什么是文件 二.为何要用文件 三.如何使用文件 3.1文件操作的基本流程 3.2资源回收with上下文管理 3.3指定操作文本的字符编码 四.文件的操作模式 4.1控制文件读写操作的模式(t ...
- HTB::OpenAdmin
实验环境 渗透过程 0x01 信息搜集 sudo nmap -sS -p1-10000 -sV -sC -T4 10.10.10.171 开放了22(SSH)端口和80(HTTP)端口 访问80端口, ...
- node+express+static完成简单的文件下载
不多说什么,直接上代码 var express = require('express'); var fs = require('fs') var path= require('path'); var ...
- 数据可视化基础专题(八):Pandas基础(七) 数据清洗与预处理相关
1.数据概览 第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info() 这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据) i ...
- 数据可视化之powerBI入门 (一)认识PowerBI
来自 https://zhuanlan.zhihu.com/p/64144024 Power BI是什么? Power BI是微软推出的数据分析和可视化工具,我们先来看看微软官方是怎么介绍的: Po ...
- JMeter-一个接口的返回值作为输入传给其他接口
背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...
- 怎样从gitHub上面拉项目
1.注册 https://gitee.com/oschina 2.拿到代码在gitHub上的地址 3.打开eclipse-->import https://git.oschina.net/cai ...