首先来说下同步异步与阻塞非阻塞的概念,同步异步与阻塞非阻塞并没有关系。同步异步主要是事情做完以后,如何进行处理、或者说关注的是一种消息通信机制。

同步的情况下,是由处理消息者自己去等待消息是否被触发;

而异步的情况下是由触发机制来通知处理消息者

举例:

所以同步异步可以说是对被请求方来说的,被请求者使用什么方式来告知处理结果

  • 思考,思考。。。。。。。,好了,有答案了,当场告诉你 -------- 同步
  • 这个问题需要一点时间,你先做点别的,等我想好了,去找你。 --------异步

阻塞非阻塞,主要是对于请求者而言的

  • 阻塞:发出请求等待结果返回,然后再处理后续的事情
  • 非阻塞:发出请求不等待结果返回,可以接着做后续的事情

上代码:

/**当我们new Promise会得到一个Promise对象,该对象会有一个任务要完成,同时该对象会维护一个状态
PromiseStatus
1:pending:正在处理
2:resolved:已完成
3:rejected:失败*/ let p1 = new Promise(function(resolve,reject){ /**要做的事情通过一个函数来完成,该函数会接收两个值
resolve
reject
这两个参数都是一个函数,当我们调用他们的时候,会改变当前任务的状态
resolve() => resolved
reject() => rejected */ setTimeout(() => {
var a = Math.random();
if(a < 0.5){
console.log(a,'p1失败')
reject(a)
}else{
console.log(a,'p1成功')
resolve(a)
}
},1000)
}) /**Promise对象还有一个then方法,当前任务成功的时候,会调用该方法,并执行该方法传入函数参数
then方法接收两个参数,它们都是函数
第一个参数是当前状态为resolved时候执行
第二个参数是当前状态为rejected时候执行*/ p1.then(a => {
console.log('成功',a)
},a => {
console.log('失败',a)
}) /**虽然then方法中的参数接收两个
一个是成功的callback
一个是失败的callback
但是,在书写的时候,如果每一个then都传这两个callback的话,编写过程太麻烦,为了能够统一的处理失败Pormise对象又提供了一个新的方法:catch,catch方法也接收一个callback
只要有一个Promise的状态变成了rejected,那么就会被catch方法捕获,执行catch的callback*/ .then((a) => {
return new Promise((resolve,reject) => {
setTimeout(() => {
a *= a;
console.log(a,'p1成功')
reject(a);
},1000)
})
}).then((a) => {
console.log(a,'p1的then里成功')
}).catch((a) => {
console.log(a,'失败捕获')
})

看打印出来的结果:

当p1中的随机数a < 0.5时,就直接进入catch里捕获到失败了,后面的then都不会执行

当p1中的随机数a > 0.5时,就进入到第一个then里,第一个then里又有一个promise对象,但是执行的是reject函数,所以就会直接到catch里捕获到失败

情形:在一个Promise任务中需要处理多个异步任务,这多个的异步任务是同时进行的,但是执行时间是不确定的,后续的任务需要这几个异步任务全部完成之后在执行,这时候就需要用到Promise里面提供的all方法来实现

var p1 = new Promise((resolve,reject) => {
let a = 1;
setTimeout(() => {
a++;
resolve(a);
},Math.random() * 1000)
}) var p2 = new Promise((resolve,reject) => {
let b = 2;
setTimeout(() => {
b++;
resolve(b);
},Math.random() * 1000)
}) /**把两个不同的异步任务分别包装在一个Promise对象里,然后调用Promise对象静态方法all,把上面多个不同异步Promise作为数组传递给all方法的参数,当多个异步任务的状态都变成resolve,那么all的状态才是resolved,但是只要有一个异步任务的状态变成了rejected,那么all的状态就会变成rejected*/ Promise.all([p1,p2]).then(([a,b]) => {
console.log(a,b)
}).catch((err) => {
console.log(err)
})

打印台:

over~

promise对象里resolve和reject状态讲解及Promise.all()的使用的更多相关文章

  1. 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)

    本文同步自我的个人博客: http://mly-zju.github.io/ 众所周知javascript语言的一大特色就是异步,这既是它的优点,同时在某些情况下也带来了一些的问题.最大的问题之一,就 ...

  2. Promise对象的resolve回调函数和reject回调函数使用

    Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...

  3. JavaScript异步与Promise基本用法(resolve与reject)

    Promise解决的问题相信每个前端都遇到过这样一个问题,当一个异步任务的执行需要依赖另一个异步任务的结果时,我们一般会将两个异步任务嵌套起来,这种情况发生一两次还可以忍,但是发生很多次之后,就形成了 ...

  4. resolve和reject不会终结Promise的参数函数的执行

  5. 16. Promise对象

    目录 Promise对象 一.含义 1. Promise是什么 2. 实例讨论 二.Promise特性案例解析 1. Promise的立即执行性 2. promise的三种状态 3. Promise的 ...

  6. 谈谈 ES6 的 Promise 对象

    https://segmentfault.com/a/1190000002928371 前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般 ...

  7. Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...

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

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

  9. 通过一道笔试题浅谈javascript中的promise对象

    因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ...

随机推荐

  1. Jenkins(3)- 安装Jenkins过程中遇到问题的排查思路

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 安装Jenkins过程中,可能会遇 ...

  2. ansible的剧本play(四)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA68AAAETCAYAAADZDzDOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw

  3. MySQL join的7种理论及SQL写法

    转载于    https://www.cnblogs.com/dinglinyong/p/6656315.html 建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE d ...

  4. HDU 5416 CBR and tree

    #include<bits/stdc++.h> using namespace std; #define for(i,a,b) for(int i=a;i<=b;++i) //T,N ...

  5. BigDecimal 01 - 在JAVA中怎么比较Double类型数据的大小?

    2019独角兽企业重金招聘Python工程师标准>>>  非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型! double a = 0.001;  doub ...

  6. 【K8S】K8S部署Metrics-Server服务

    写在前面 在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存.磁盘.CPU和网络的使用率等信息. 读者可参考< ...

  7. 升级vue项目中的element-ui的版本

    首先卸载项目中的element-ui 命令为: npm uninstall element-ui / cnpm uninstall element-ui 安装更新最新的element-ui 命令为 n ...

  8. POJ 2188 Cow Laundry

    Cow Laundry Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1376 Accepted: 886 Descriptio ...

  9. 线程池(Java中有哪些方法获取多线程)

    线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...

  10. Spring官网阅读(七)容器的扩展点(二)FactoryBean

    在上篇文章中我们已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍.其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程 ...