Promise基本概念

本文深入介绍了Promise的基本概念,包括同步回调与异步回调的区别、错误处理机制,以及Promise的创建、状态转换、API使用、链式调用、错误处理和优势。通过实例解析,帮助读者理解和掌握Promise在异步编程中的应用。
摘要由CSDN通过智能技术生成

Promise

第1章:准备

1.1区别实例对象和函数对象

1.实例对象:new函数产生的对象,称为实例对象,简称对象

2.函数对象:将函数作为对象使用时,简称为函数对象

1.1.1.同步回调

1.理解:立即执行,完全执行了才会结束,不会放入回调队列中

2.例子:数组遍历相关的回调函数/ Promise的extcutor函数

1.1.2.异步回调

1.理解:不会立即执行,会放入回调队列中将来执行

2.例子:定时器回调 / ajax回调 / Promise的成功|失败的回调

1.2.JS的error的处理

1.2.1.错误的类型

Error:所有错误的父类型

ReferenceError:引用的变量不存在

TyprError:数据类型不正确

RangeError:数据值不在其所允许的范围内

SyntaxError:语法错误

1.2.2.错误处理

捕获错误:try{}catch{}

抛出错误:throw error

1.2.3.错误对象

message属性:错误相关信息

stack属性:记录信息

第2章:promise的理解和使用

2.1.Promise是什么?

2.1.1.理解

1.抽象表达:

​ Promise是JS中进行异步编程的新方案(旧的是谁?—纯回调)

2.具体表达:

​ (1)从语法上来说:Promise是一个内置的构造函数

​ (2)从功能上来说:Promise对象用来封装一个异步操作并可以获取其结果

2.1.2.promise的状态改变

1.pending 变为 fulfilled

2.pending 变为 rejected

说明:只有这2种,且为一个Promise对象只能改变一次

​ 无论变为成功还是失败,都会有一个结果数据

​ 成功的结果数据一般称为value,失败的结果数据一般称为reason

强调:

1.Promise不是回调,是一个内置的构造函数,是程序员自己new调用的。

2.new Promise的时候,要传入一个回调函数,它是同步的回调,会立即在主线上执行,它被称为executor函数

3.每一个promise实例对象都有3种状态,分别为:初始化(pending)、成功(fulfilled)、失败(rejected)

4.每一个promise实例在刚被new出来的那一刻,状态都是初始化(pending)

5.executor函数会接收到两个参数,它们都是函数,分别用形参:resolve、reject接收

(1)调用resolve,会让Promise实例状态变为:成功(fulfilled),同时可以指定成功的value

(2)调用reject,会让Promise实例状态变为:失败(rejected),同时可以指定失败的reason

2.1.3.Promise的基本使用

1.重要语法

new Promise(wxecutor)构造函数

Promise.prototype.then方法

2.基本编码流程

1.创建Promise的实例对象(pending状态),传入executor函数

2.在executor中启动异步任务(定时器、ajax请求)

3.根据异步任务的结果,做不同处理:

​ 3.1 如果异步任务成功了:

​ 我们调用resolve(value),让Promise实例对象状态变为成功(fulfilled),同时指定成功的value

​ 3.2 如果异步任务失败了:

​ 我们调用reject(value),让Promise实例对象状态变为失败(rejected),同时指定失败的reason

4.通过then方法为Promise的实例指定成功、失败的回调函数,来获取成功的value、失败的reason

​ 注意:then方法所指定的:成功的回调、失败的回调,都是异步的回调;

3.关于状态的注意点:

(1).三个状态:

​    pending:未确定的-------初始状态

​    fulfilled:成功的-------调用resolve()后的状态

​    rejected:失败的--------调用reject()后的状态

  (2).两种状态的改变:

​    pending ==> fulfilled

​    pending ==> rejected

  (3).状态只能改变一次!!

  (4).一个promise指定多个成功/失败回调函数,都会调用吗?----会

2.2.Promise的API

1.Promise构造函数:new Promise(executor){}

  executor函数:是同步执行的,(resolve,reject) => {}

  reslove函数:调用resolve将Promise实例内部状态改为成功(fulfilled)

  reject函数:调用reject将Promise实例内部状态改为失败(rejected)

说明:executor函数会在Promise内部立即同步调用,异步代码放在executor函数中

2.Promise.prototype.then方法:Promise实例.then(onFulfilled,onRejected)

  onFulfilled:成功的回调函数 (value) => {}

  onRejected:失败的回调函数 (reason) => {}

特别注意(难点):then方法会返回一个新的Promise实例对象

3.Promise.prototype.catch方法:Promise实例.catch(onRejected)

  onRejected:失败的回调函数 (reason) => {}

说明:catch方法是then方法的语法糖,相当于:then(undefined,onRejected),undefined在这里相当于占位

4.Promise.resolve方法:Promise.resolve(value)

说明:用于快速返回一个状态为fulfilled或rejected的Promise实例对象

 备注:value的值有两种情况:

​          (1)非Promise值:数字、数组、函数

​          (2)Promise值,如果Promise值是失败的,那么最后返回的是失败的对象

5.Promise.reject方法:Promise.reject方法(reason)

说明:用于快速返回一个状态必为rejected的Promise实例对象

6.Promise.all方法:Promise.all(promiseArr)

promiseArr:包含n个Promise实例的数组

说明:返回一个新的Promise实例,成功还是失败?以最先出结果的promise为准。

7.Promise.race方法:Promise.race(PromiseArr)

PromiseArr:包含n个Promise实例的数组

说明:返货一个新的Promise实例,成功还是失败?以最先出结果的promise为准。

2.3.Promise几个关键问题

2.3.1.如何改变一个Promise实例的状态?
(1)执行resolve(value):如果当前是pending就会变为fulfilled

(2)执行reject(reason):如果当前是pending就会变为rejected

(3)执行器函数(executor)抛出异常:如果当前是pending就会变为rejected
2.3.2.改变Promise实例的状态和指定回调函数谁先谁后?

1.都有可能,正常情况下是先指定回调函数再改变状态,但也可以先改变状态在指定回调。

2.如何先改变状态在指定回调?

​ 延迟一会在调用then(),给then添加定时器

3.Promise实例什么时候才能得到数据?

​    (1)如果先指定的回调,那当状态发生改变时,回调函数就会调用得到数据。

​    (2)如果先改变的状态,那当指定回调时,回调函数就会调用得到数据。
2.3.3.Promise实例.then()返回的是一个【新的Promise实例】,它的值和状态有什么决定?

1.简单表达:由then()所指定的回调函数执行的结果决定

2.详细表达:【牢记】

​    (1)如果then所指定的回调返回的是非Promise值a:

​      那么【新的Promise实例】状态为:成功(fulfilled),成功的value为a

​    (2)如果then所指定的回调返回的是Promise实例p:

​      那么【新的Promise实例】状态、值,都与p一致

​    (3)如果then所指定的回调抛出异常:

​      那么【新的Promise实例】状态为rejected,reason为抛出的那个异常
const p = new Promise((resolve, reject) => {
   
           setTimeout(() => {
   
                resolve(100);
           },1000);
        });
        /* p.then(
            //value => {console.log('成功1',value);},
            //value => {console.log('成功1',value); return 200},//成功1 100
            value => {console.log('成功1',value); return Promise.reject('a')},
            reason => {console.log('失败1',reason);}
        ).then(
            value => {console.log('成功2',value);}, //成功2  undefined,返回undefined是因为第28行没有返回值给x,但是Undefined又属于非Promise,所以是成功了
            //value => {console.log('成功2',value);}, //成功2  200
            reason => {console.log('失败2',reason);}
            //reason => {console.log('成功2',value);}, //失败2  a
        ); */
        p.then(
            value => {
   console.log('成功1',value); return Promise.reject('a')}, //成功1 100
            reason => {
   console.log('失败1',reason);}
        ).then(
            value => {
   console.log('成功2',value); return true},
            reason => {
   console.log('失败2',reason); return 100} //失败2 a
        ).then(
            value => {
   console.log('成功3',value); throw 200}, //成功3 100
            reason => {
   console.log('失败3',reason
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值