promise构造时的resolve方法执行了来触发then执行吗?

  1. Promise是一门新的技术(ES6规范)
  2. Promise是JS中进行异步编程的新解决方案
    备注:旧的方案是单纯使用回调函数

  1. 从语法上来说:Promise是一个构造函数
  2. 从功能上来说:Promise对象用来封装一个异步操作并可以获取其成功或失败的结果值。

Promise的状态指的是实例对象中的一个属性PromiseState,它的值有三个:

Promise的状态改变只有下面的三种情况:

说明:只有这2种,且一个Promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason

Promise实例对象中还有一个属性PromiseResult,保存着对象成功/失败的结果。要想改变它的值,只有通过给resolve()或者reject()方法传参,成功时,将对应数据传入resolve()方法,失败时,将对应的数据传入reject()方法,之后可以在then(value

需求:点击按钮,1秒后显示是否中奖(30%概率中奖)。若中奖,弹出:恭喜恭喜,奖品为10万RMB玛莎拉蒂优惠券;若未中奖弹出:再接再厉。

html页面,放个标题和按钮即可:

* 点击按钮, 2s 后显示是否中奖(30%概率中奖) * 若中奖,弹出:恭喜恭喜,奖品为 10万 RMB 玛莎拉蒂优惠券 * 若未中奖弹出: 再接再厉 // 30% 中奖概率,如果数字为1—100,那么我们随机数小于30,就认为它中奖了(简易的算法)
// resovle 解决 是函数类型的数据 异步任务成功时调用 // reject 拒绝 是函数类型的数据 异步任务失败时调用 // 30% 中奖概率,如果数字为1—100,那么我们随机数小于30,就认为它中奖了 // then方法的第一个回调函数,promise对象状态为成功时调用,第二个回调函数,promise对象状态为失败时调用

现在需求变更,在弹出提示时,同时告知本次抽到的数字。

// 30% 中奖概率,如果数字为1—100,那么我们随机数小于30,就认为它中奖了 alert('恭喜恭喜,奖品为 10万 RMB 玛莎拉蒂优惠券,您的中奖数字为:' + n);
// 如果现在需要在弹出提示时,同时告知本次的号码,该怎么办? // 只需要将成功或失败的值分别传入 resolve() 和 reject() 方法,然后再then()方法的两个回调函数中接收即可。 // 30% 中奖概率,如果数字为1—100,那么我们随机数小于30,就认为它中奖了 // then方法的第一个回调函数,promise对象状态为成功时调用,第二个回调函数,promise对象状态为失败时调用

指定回调函数的方式更加灵活

  1. 旧的:必须在启动异步任务前指定
  2. promise:启动异步任务=> 返回promise对象=>给promise对象绑定回调函数(甚至可以在异步任务结束后指定一个或多个)

支持链式调用,可以解决回调地狱问题

回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件

例如,下面的代码是Node.jsfs模块读取三个文件,并将读取到的结果进行拼接并且输出到控制台中。

这个代码片段,fs.readFile()在嵌套调用,这里就形成了回调地狱。

  1. resolve函数:内部定义成功时我们调用的函数
  2. reject函数:内部定义失败时我们调用的函数

说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行。

说明:指定用于得到成功value的成功回调和用于得到reason的失败回调,返回一个新的Promise对象。

catch()只能指定失败的回调,不能指定成功的回调。其实也是使用then()实现的.

说明:返回一个成功/失败Promise对象

// 如果传入的参数为 非Promise类型的对象,返回的结果为 成功的Promise对象 // 如果传入的参数为 Promise对象,则参数的结果决定了resolve的结果 // 失败的同时还报错了,原因是没有对错误进行处理,这里使用catch()进行处理就能解决报错

说明:返回一个失败的Promise对象

// 总结,Promise.reject()方法,无论你传入什么得到的都是失败的Promise对象,并且失败的结果就是你传入的参数。

说明:返回一个新的Promise对象,只有所有的Promise都成功才成功,只要有一个失败了就直接失败,失败的结果就是失败的Promise对象的结果。

all()方法的示例:

// 如果数组中 p2 是一个失败的Promise,那么all()方法返回的是一个失败的Promise对象,并且失败的结果是数组中失败的Promise对象的结果。

说明:该方法返回的结果总是状态为成功的Promise对象,这个Promise对象的结果值是包含promises参数中每一个promise对象的状态以及结果值的对象数组。

注意和all()方法的区别。

// 它的结果值是包含每一个promise对象的状态以及结果值的对象。

说明:返回一个新的Promise对象,第一个完成的Promise对象的结果状态就是最终的结果状态

// 代码从上往下执行,所以p1最先执行,所以result的状态和结果应该是p1的状态和结果。 // p4为异步代码,p5 会先于p4、p6执行,所以p5的状态和结果即为result2的状态和结果。

如何改变Promise的状态?

改变Promisede状态有三种方法:

一个Promise指定多个成功/失败的回调函数,都会调用吗?

指定回调用的就是then(),所以这个题目的意思是如果使用then()方法为一个promise对象指定多个回调,那么这些回调是否都会执行?

答案是:当Promise改变为对应状态时都会调用。

// 有弹框,控制台有输出,说明这两个回调都执行了。

改变Promise状态和指定回调函数谁先执行谁后执行?

  1. 都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调
  2. 如何先改状态再指定回调?
  • then()方法延迟更长时间才被调用

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

    • 如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据
    • 如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据
// 1. 当Promise构造函数中的executor执行器函数内部是同步任务时,先改变状态,在执行then()方法指定回调(注意是指定回调,不是执行回调) // 2. 当Promise构造函数中的executor执行器函数内部是异步任务时,那么是先执行then()方法指定回调函数,再改变状态。

  1. 简单表达:由then()指定的回调函数执行的结果决定
  • 如果返回的是另一个新promise,此promise的结果就会成为新promise的结果

promise如何串连多个操作任务?

  1. 通过then的链式调用串连多个同步或异步任务

  1. 当使用promisethen链式调用时,可以在最后指定失败的回调
  2. 前面任何操作除了异常,都会传到最后失败的回调中处理
// 在调用链的最后指定失败的回调,就可以处理任务当中出现的错误,这个现象称为异常穿透。

当使用promisethen链式调用时,想要在中间中断,不再调用后面的回调函数,有且只有一个办法:在回调函数中返回一个pending状态的promise对象。

// 如果想要中断这个then调用链,有且只有一个方式,在需要中断的回调函数中,返回一个pending状态的promise对象 // 假如后面不想让它调用了,有且仅有一个方式:返回一个pending状态的promise对象
}

在 Promise 上,有两个函数,分别叫做 resolve(成功之后的回调函数) 和 reject(失败之后的回调函数)

Promise 表示一个 异步操作;每当我们 new 一个 Promise 的实例,这个实例,就表示一个具体的异步操作;

既然 Promise 创建的实例,是一个异步操作,那么,这个 异步操作的结果,只能有两种状态:

状态1: 异步执行成功了,需要在内部调用 成功的回调函数 resolve 把结果返回给调用者;

状态2: 异步执行失败了,需要在内部调用 失败的回调函数 reject 把结果返回给调用者;

由于 Promise 的实例,是一个异步操作,所以,内部拿到 操作的结果后,无法使用 return 把操作的结果返回给调用者; 这时候,只能使用回调函数的形式,来把 成功 或 失败的结果,返回给调用者;

}

我要回帖

更多关于 constructor在对象被new时执行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信