JS-Promise

同步

概念:前一个任务完成后,再依次执行下一个任务,任务执行顺序与排列的顺序一致。
例子:食堂打饭,车站买票排队

异步

概念:异步是非阻塞的,异步逻辑与主逻辑相互独立,主逻辑不需要等待异步逻辑完成,也可以继续执行下去。
例子:车站买票队列ABCDEF,B有事无法先买票,就先让出位置,给后面的CDEF先执行买票,待B事情完成后再继续排队买票。
代码实例:

console.log('a')
console.log('b')
console.log('c')
setTimeout(() => {
    
     console.log('get') }, 2000) //异步操作
console.log('d')
console.log('e')

输出结果:abcde get

Promise是什么?

概念:ES6新增的内容,是异步编程的一种解决方案,比传统的回调函数和事件解决方案更加合理强大。简单说Promise是一个容器,里面保存未来才会结束的事情(通常是一个异步操作),从语法上讲,Promise是一个对象,用来获取异步操作的消息。
两个特点:
1、promise的状态不受外部影响
2、promise的状态以但改变,就不回再变化了
三个状态:
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[拒绝]操作失败

var promise = new Promise(传入一个函数);
var promise = new Promise(function (resolve, reject)) {
    
    
	if(/*异步操作成功*/) {
    
    
		resolve(value);
	} else {
    
    
		reject(error);
	}
});

Promise解决的痛点是什么?

  1. 解决异步操作函数里的嵌套回调(callback hell)问题
  2. promise可以支持多个并发的请求,获取并发请求中的数据
  3. promise可以解决可读性的问题,异步的嵌套带来的可读性的问题,它是由异步的运行机制引起的,这样的代码读起来会非常吃力
  4. promise可以解决信任问题,对于回调过早、回调过晚或没有调用和回调次数太少或太多,由于promise只能决议一次,决议值只能有一个,决议之后无法改变,任何then中的回调也只会被调用一次,所以这就保证了Promise可以解决信任问题 5)Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了

Promise 如何使用?

  1. 创造一个Promise实例
  2. Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数
  3. 可用Promise的try和catch方法预防异常

1、Promise.prototype.then()

当promise状态发生改变,就会触发then()里响应函数处理后续步骤
状态改变,只有两种可能:
pending => fulfilled
pending => rejected

var promise = new Promise(function (resolve, reject)) {
    
    
	if(false) {
    
    
		resolve('success');
	} else {
    
    
		reject('fail');
	}
});
promise.then(res => {
    
    
	console.log(res) //失败 resolve('success')
}).catch(err => {
    
    
	console,log(err) //失败 reject('fail');
});

2、Promise.prototype.catch()

Promise.prototype.catch()是.then(null,rejection)的别名,用于指定发生错误时的回调函数。如果Promise状态以及变成resolved,再抛出错误是无效的。因为Promise的状态一旦改变,就永久保持该状态,不会再变了。Promise对象的错误具有冒泡性质,会一直向后传递,直到被捕获为止,也就是说错误总会被下一个catch语句捕获。
简:Promise.prototype.catch 用来捕获 promise 的异常,就相当于一个没有成功的 then。

Promise.prototype.catch = function(errCallback){
    
    
  return this.then(null,errCallback)
}

3、Promise.all

Promise.all可以将多个Promise实例包装成一个新的Promise实例,同时成功和失败的返回值都是不同的,成功的时候返回一个结果数组失败时候返回最先被reject失败状态的值
简:promise.all 是解决并发问题的,多个异步并发获取最终的结果(如果有一个失败则失败)。
在这里插入图片描述

4. Promise.prototype.finally()

finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。

Promise.prototype.finally = function(callback) {
    
    
  return this.then((value)=>{
    
    
    return Promise.resolve(callback()).then(()=>value)
  },(reason)=>{
    
    
    return Promise.resolve(callback()).then(()=>{
    
    throw reason})
  })  
}

5、Promise.race

Promise.race是赛跑的意思,Promise.race([p1,p2,p3])里面那个结果获得的快,就返回哪个结果,不管结果本身是成功还是失败状态。
简:Promise.race 用来处理多个请求,采用最快的(谁先完成用谁的)。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43176019/article/details/108272917