promise知识点小结
断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结。
为什么使用promise
谈到Promise,我们知道,这是社区较理想的异步编程解决方案。想要掌握promise,我们首先要知道其提出原因。promise的提出很好的解决了多个相互依赖的代码之间的嵌套问题,比如说C代码需要B代码的结果,B代码需要A代码的结果,用传统的方案,会出现层层嵌套的情况,不易维护。
promise对象是什么
promise对象一共有三种状态
- pending(进行中)
- fulfilled(已成功)
- rejected
promise对象有几种相关方法
let promise = new Promise((resolve,reject) => {
//....
resolve('2');
//....
//reject('4');
})
最简单创建对象的方法,就是为resolve和reject的状态分别传递参数,也就是成功后的信息或是失败时的提示,当然,不一定要两种状态同时都有。
then方法,接受两个参数,第一个为fulfilled状态下要进行的步骤,第二个参数可选,指的是rejected状态下执行的方法
当然,更推荐使用catch方法来定义错误状态下的方法,也和try...catch结构类似
promise
.then((data) => { //cb
// success
})
.catch((err) => {
// error
});
这个对象有几个特点,
1.比如状态一旦更改,就不会再发生变化,也就是说pending状态一旦转换成fulfuilled或rejected就不再变化了。
let promise = new Promise((resolve,reject) => {
resolve('2');
reject('4');
})
比如上面的代码,promise在进入fulfulled状态后就不再发生变化了,因此reject的操作是无效的。
2.比如promise对象创建中的代码是同步的,而then方法是异步的。
let promise = new Promise((resolve, reject) => {
console.log('1');
resolve('2');
});
promise.then((resolve,reject) => {
console.log(resolve);
})
console.log(3);
// 1 3 2
promise对象创建以后立即执行,故输出1,then方法为异步执行,被放入等待的实践队列,在本次事件循环结束时执行,故先打印3,最后打印2。
3.不会主动抛出错误
这一点比较特别,意味着我们必须定义catch方法或then的第二个参数来获取错误,不然,错误无法被发现
4.chain 链式结构
then函数的可以接另一个then函数,而then函数返回一个promise对象,因此,这一个promise对象就决定了执行后面的哪些方法
与promise相关的问题
then方法与settimeout
这一个问题非常典型,其实只要明白一点:settimeout在下一轮“事件循环”的时候开始执行,Promise.then()在本轮“事件循环”结束时执行。
setTimeout(function () {
console.log('1');
}, 0);
Promise.resolve().then(function () {
console.log('2');
});
console.log('3');
输出3 2 1
其实,这些方法,还是要多使用,多练习,才能得心应手
promise知识点小结的更多相关文章
- C++重要知识点小结---3
C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...
- C++重要知识点小结---2
C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...
- React及Nextjs相关知识点小结
React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- SpringBoot 系列教程之事务隔离级别知识点小结
SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...
- disruptor笔记之四:事件消费知识点小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- promise知识点汇总
Promise对象被写进ES6的规范当中,提供的是另外一种更加友好的对于异步编程的解决方案,在这之前大多使用的是回调函数和事件来实现异步编程. 怎么来理解Promise对象呢?对于这个ES6新加入的小 ...
- Vuejs技术栈知识点小结
前言 上家公司的项目主要是使用jQuery和Angular1,然后自己学了React,没想到来到这家公司突然开始做vue,不过vue还是挺容易上手的.下面是vue技术栈的一些总结,都是来自官网,主要是 ...
- shell知识点小结
目录 引言 shell中的数组 数组的定义 数组的使用 实际的例子 shell中大小的比较 shell中的括号 shell中函数的定义 杂项知识点 字符串转数组 常用判断标志 linux后台运行相关 ...
随机推荐
- angular4 使用swiper 首次加载问题(一)
angular 在使用外部插件swiper 还是有不少小坑的,下面来聊一聊.angular在使用swiper 的一些坑 一开始觉得使用外部引入的方式比较好,就在外部定义了.简单快捷方便, 但是在开发后 ...
- PHP百度AI的OCR图片文字识别
第一步可定要获取百度的三个东西 要到百度AI网站(http://ai.baidu.com/)去注册 然后获得 -const APP_ID = '请填写你的appid'; -const API_KEY ...
- NOIP2015题解
D1T1模拟 #include<bits/stdc++.h> #define re(i,l,r) for(int i=(l);i<=(r);i++) using namespace ...
- Jmeter上传附件EXCEL
1.通过对上传附件接口进行抓包,获取的信息如下: 2.在jmeter脚本中添加http请求,并添加http请求头信息如下: 3.在http请求中添加上传附件的内容如下,由于我上传的是excel,所以M ...
- redis的架构(一)
redis认证 redis的认证比较简单,这里简单来说明一下怎么设置redis的认证: redis的配置文件中有一个requirepass字段,在后面直接写上对应的密码即可.默认redis的不开启认证 ...
- 1.求链表中的倒数第K个节点
注意事项:1.要是K大于链表长度怎么办? 2.k<=0怎么办? ListNode* FindR_Kth(ListNode* p_head, unsigned int k) 2 {//找到链表的倒 ...
- day 06
深浅拷贝 # 值拷贝:应用场景最多ls = [1, 'abc', [10]]ls1 = ls # ls1直接将ls中存放的地址拿过来# ls内部的值发生任何变化,ls1都会随之变化ls2 = l ...
- Chrome VSCode常用快捷键
MAC下快捷键 Chrome快捷键: 关闭标签页:Cmd + w 新建标签页:Cmd + t 切换到指定标签页:Cmd + 数字 正向切换标签页: Ctrl + Tab 反向切换标签页: Ctrl + ...
- maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
转自https://blog.csdn.net/lovesomnus/article/details/49512777 在maven中央库中查找ojdbc,发现最新的版本是10.2.0.4.0,然后在 ...
- Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...