1.①Promise(内是executor回调,两个函数参数resolve和reject)then值value和reason②catch只输出失败reason③all正确数组和race④封装ajax

目录

一:准备:函数对象与实例对象

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

2.实例对象:new构造函数或类产生的对象,我们称之为实例对象。

二:准备:回调函数的分类

1.什么是回调?  没用调用,但是最终执行了

2.同步的回调函数:

3.异步的回调函数:

三:准备:js中的控制台报错

四:Promise认识

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

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

5.executor函数会接收到2个参数,分别用形参:resolve和reject两个函数接收,分别代表成功和失败,调用方式如下:

6.promise.prototype.then

如果是成功会输出成功函数里面的值'ok';如果失败输出失败函数里面的值,但是失败会有报错,因为没有回调函数,解决办法实例化对象.then()   ——————then里面放两个回调分别代表成功(参数为value)和失败(参数为reason)

7.注意:then方法所指定的:成功的回调、失败的回调,都是异步的回调。 异步优先级:process.nextTick>promise.then>setTimeout>setImmediate(后两个看setTime具体延时多久)

10.promise.prototype.catch

11. Promise.resolve不一定成功和Promise.reject一定失败

12.Promise.all和Promise.race


一:准备:函数对象与实例对象

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

有个注意事项:name不能修改是函数对象不可修改的属性

2.实例对象:new构造函数或类产生的对象,我们称之为实例对象。

二:准备:回调函数的分类

1.什么是回调?  没用调用,但是最终执行了

2.同步的回调函数:

3.异步的回调函数:

 

三:准备:js中的控制台报错

错误大全:此链接

 四:Promise认识

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

从语法上来说: Promise本身是一个内置的构造函数,不是回调,是程序员自己new调用的

从功能上来说: promise的实例对象可以用来封装一个异步操作(就是把异步函数比如settime等放在promise的executor回调函数中),并可以获取其成功/失败的值

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


3.每一个Promise实例都有3种状态:初始化(pending)、成功(fulfilled)、失败(rejected)
4.每一个Promise实例在刚被new出来的那一刻,状态都是初始化(pending)

5.executor函数会接收到2个参数,分别用形参:resolve和reject两个函数接收,分别代表成功和失败,调用方式如下:

6.promise.prototype.then

如果是成功会输出成功函数里面的值'ok';如果失败输出失败函数里面的值,但是失败会有报错,因为没有回调函数,解决办法实例化对象.then()   ——————then里面放两个回调分别代表成功(参数为value)和失败(参数为reason)

基本编码流程
  1.创建Promise的实例对象(pending状态), 传入executor函数
  2.在executor中启动异步任务(定时器、ajax请求)
  3.根据异步任务的结果,做不同处理:
	3.1 如果异步任务成功了:
	      我们调用resolve(value), 让Promise实例对象状态变为成功(fulfilled),同时指定成功的value
    3.2 如果异步任务失败了:
		  我们调用reject(reason), 让Promise实例对象状态变为失败(rejected),同时指定失败的reason
  4.通过then方法为Promise的实例指定成功、失败的回调函数,来获取成功的value、失败的reason

7.注意:then方法所指定的:成功的回调、失败的回调,都是异步的回调。 异步优先级:process.nextTick>promise.then>setTimeout>setImmediate(后两个看setTime具体延时多久)

 

 8.promise实例封装ajax异步任务

 <script>
        let p = new Promise((resolve, reject) => {
            // ajax异步
            let xhr = new XMLHttpRequest()
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(xhr.response)
                    } else {
                        reject('请求出错')
                    }
                }
            }
            xhr.open('GET', 'https://api.apiopen.top/getJoke')
            xhr.responseType = 'json'
            xhr.send()
        })

        p.then(
            (value) => { console.log('成功了:', value) },
            (reason) => { console.log('失败了:', reason) }
        )
    </script>

9.  .then方法会返回一个新的Promise实例

10.promise.prototype.catch

①成功可以没有失败的回调

②失败必须前面有成功的回调,除非用catch,或者让成功语句变成undefined

 

11. Promise.resolve不一定成功和Promise.reject一定失败

    <script>
        /* 一:Promise.resolve(value值) 用于快速返回一个状态为fulfilled或reject和Promise实例对象
              不一定是成功
              因为传入的value值,可能是reject的,见下面第三种混合*/

        // 1.麻烦老式方法:
        let p = new Promise((resolve, reject) => {
            resolve(100)
        })
        p.then(
            (value) => { console.log('成功了:', value) },   //成功了: 100  立即输出
            (reason) => { console.log('成功了:', reason) }
        )

        // 2.借助promise自身的resolve
        let p2 = Promise.resolve(200)
        p2.then(
            (value) => { console.log('成功了2:', value) }   //成功了2: 100  立即输出
        )

        /* 二:Promise.reject(值) 用于快速返回一个状态一定为fulfilled和Promise实例对象
              一定是失败 */
        let p3 = Promise.reject(-100)
        p3.then(
            (ralue) => { console.log('成功:', value) },
            (reason) => { console.log('失败:', reason) }    //失败: -100   立即输出
        )

        // 三:混合。。。
        let pp = Promise.reject(-800)
        let p4 = Promise.resolve(pp)
        p4.then(
            (value) => { console.log('p4成功了:', value) },
            (reason) => { console.log('p4失败了', reason) }    //  p4失败了 -800
        )
    </script>

12.Promise.all和Promise.race

 ①all()里面传一个数组[]里面是promise的实例化对象,当数组全部为正确时,输出一个value数组

                                          当某一个错误时,输出错误项的reason值

    <script>
        // 情况1:全部正确
        let p1 = Promise.resolve('a')
        let p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('b')
            }, 500)
        })
        let p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('c')
            }, 2000)
        })
        let arr = Promise.all([p1, p2, p3])
        arr.then(
            (value) => { console.log('正确:', value) },   // 2秒后输出:正确:["a", "b", "c"]
            (reason) => { console.log('错误:', reason) }
        )

        // 情况2:有一个错误
        let p1 = Promise.resolve('a')
        let p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                reject('b')
            }, 500)
        })
        let p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('c')
            }, 2000)
        })
        let arr = Promise.all([p1, p2, p3])
        arr.then(
            (value) => { console.log('正确:', value) },
            (reason) => { console.log('错误:', reason) }  //0.5秒后输出 :错误: b
        )
    </script>

 ②race()里面传的也是数组,但是输出只输出第一个运行的

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值